diff --git a/404.html b/404.html new file mode 100644 index 000000000..c3d546dc0 --- /dev/null +++ b/404.html @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + +404 Page not found | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+

Not found

+

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.

+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..170be2baa --- /dev/null +++ b/CNAME @@ -0,0 +1,4 @@ +www.drycc.cc +www.drycc.com +drycc.cc +drycc.com diff --git a/about/featured-background.svg b/about/featured-background.svg new file mode 100644 index 000000000..4400b877e --- /dev/null +++ b/about/featured-background.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/about/index.html b/about/index.html new file mode 100644 index 000000000..d71258bc4 --- /dev/null +++ b/about/index.html @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + +About | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + +
+
+
+
+

About Drycc

+ +
+ +

Drycc, the only Container as a Service (CaaS) you need.

+ + +
+
+
+
+ +
+ +
+
+
+
+
+

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 value each other

+

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.

+

Work for Customer Success

+

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 embrace failure

+

We try things, break things, take risks, and believe failure is key to innovation. We bounce back from failure and learn quickly.

+

We are committed to open source

+

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.

+
+
+
+ +
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/2018/10/06/welcome-to-drycc/index.html b/blog/2018/10/06/welcome-to-drycc/index.html new file mode 100644 index 000000000..ef3f561cc --- /dev/null +++ b/blog/2018/10/06/welcome-to-drycc/index.html @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + +Welcome to Drycc | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+

Welcome to Drycc

+
Drycc Workflow is A Open, Unified, Lightweight, Simpler Containers as a Service (CaaS).
+ + +

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.

+ + + + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/2019/10/06/drycc-workflow-v1.2.0/index.html b/blog/2019/10/06/drycc-workflow-v1.2.0/index.html new file mode 100644 index 000000000..28cf4fcef --- /dev/null +++ b/blog/2019/10/06/drycc-workflow-v1.2.0/index.html @@ -0,0 +1,316 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow v1.2.0 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+

Drycc Workflow v1.2.0

+
New Drycc Workflow Release v1.2.0
+ + +

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.

+

Workflow ## v1.1.0 -> v1.2.0

+

Releases

+
    +
  • builder v1.0.1 -> v1.0.2
  • +
  • slugbuilder v1.0.0 -> v1.1.0
  • +
  • dockerbuilder v1.0.0 -> v1.1.0
  • +
  • controller v1.1.0 -> v1.2.0
  • +
  • slugrunner v1.0.0 -> v1.1.0
  • +
  • registry v1.0.0 -> v1.0.1
  • +
  • registry-proxy v1.0.1 -> v1.0.2
  • +
+

Features

+
    +
  • e5584e3 (controller) - controller: add STACK support
  • +
  • ad34dc1 (dockerbuilder) - kaniko: use kaniko replace docker-py
  • +
  • b81430e (dockerbuilder) - dockerbuilder: change image to image.json format
  • +
  • 60dde96 (slugbuilder) - slugbuilder: add STACK support
  • +
  • fe8b6e5 (slugrunner) - slugrunner: add STACK support
  • +
+

Maintenance

+
    +
  • 942f050 (builder) - registry: remove env DRYCC_REGISTRY_PROXY_PORT
  • +
  • ff7a16f (builder) - registry: remove ecr and gcr registry
  • +
  • ad13683 (builder) - builder: change DRYCC_BUILD_TYPE to DRYCC_STACK
  • +
  • 6def637 (builder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY
  • +
  • 5044e22 (builder) - registry: remove registry_secret_prefix
  • +
  • 2ea39cc (builder) - controller-go-sdk: upgrade controller-go-sdk
  • +
  • 6aee0d7 (builder) - registry: optimizing variable naming
  • +
  • f9c62d9 (controller) - domain: added reserved domain check
  • +
  • f5a135b (controller) - migrations: clean old migrations
  • +
  • 4369b2c (controller) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY
  • +
  • 1057ca5 (controller) - registry: remove registry_secret_prefix
  • +
  • d114b3e (controller) - docker: update docker client
  • +
  • edbe963 (dockerbuilder) - dockerfile: change base image to alpine
  • +
  • fb35baf (dockerbuilder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY
  • +
  • 946dbf6 (dockerbuilder) - docker: remove insecure support
  • +
  • 628d853 (dockerbuilder) - proxy: add registry proxy
  • +
  • ff27cbd (registry) - env: remove unused env
  • +
  • 7204d72 (registry-proxy) - registry: optimizing variable naming
  • +
+ + + + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/2020/10/06/drycc-workflow-v1.3.0/index.html b/blog/2020/10/06/drycc-workflow-v1.3.0/index.html new file mode 100644 index 000000000..a1ff483ed --- /dev/null +++ b/blog/2020/10/06/drycc-workflow-v1.3.0/index.html @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow v1.3.0 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+

Drycc Workflow v1.3.0

+
New Drycc Workflow Release v1.3.0
+ + +

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.

+

Workflow ## v1.2.0 -> v1.3.0

+

Releases

+
    +
  • builder v1.0.2 -> v1.1.0
  • +
  • slugbuilder v1.1.0 -> v1.1.1
  • +
  • dockerbuilder v1.1.0 -> v1.1.1
  • +
  • controller v1.2.0 -> v1.2.1
  • +
  • slugrunner v1.1.0 -> v1.1.1
  • +
  • database v1.0.0 -> v1.0.1
  • +
  • fluentd v1.0.0 -> v1.0.1
  • +
  • minio v1.0.0 -> v1.0.1
  • +
  • monitor v1.0.0 -> v1.0.1
  • +
  • registry v1.0.1 -> v1.0.2
  • +
  • workflow-manager v1.0.0 -> v1.0.1
  • +
+

Features

+
    +
  • 9c7cceb (builder) - builder: add app config to env
  • +
+

Fixes

+
    +
  • 7fe44fa (controller) - docker: docker timeout must be an int, float or None
  • +
  • b196550 (controller) - controller: revert release.check_image_access for now
  • +
  • cc3ec13 (workflow-manager) - glide: bump goautoneg
  • +
+

Maintenance

+
    +
  • ef932c4 (builder) - controller-sdk-go: upgrade controller-sdk-go
  • +
  • 4654cf6 (controller) - django-rest-framework: upgrade to 3.9.3
  • +
  • 14121f1 (controller) - deps: bump djangorestframework from 3.9.3 to 3.9.4 in /rootfs
  • +
  • 385acdc (controller) - deps: bump django from 1.11.20 to 1.11.21 in /rootfs
  • +
  • fa312bb (database) - postgres: set max_connections = 1024
  • +
  • 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • b8878f6 (dockerbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • b097451 (fluentd) - fluent: upgrade fluent to v1.4
  • +
  • 4341f9a (minio) - mc: upgrade mc and minio
  • +
  • c1ee2a4 (monitor) - monitor: remove copyrights.tar.gz
  • +
  • 9854260 (registry) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • acc5627 (slugbuilder) - slugbuilder: internal support for multi buildpack
  • +
  • d58907e (slugbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • b39a0c2 (slugrunner) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
+ + + + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/2021/10/06/drycc-workflow-v1.4.0/index.html b/blog/2021/10/06/drycc-workflow-v1.4.0/index.html new file mode 100644 index 000000000..75437fe9c --- /dev/null +++ b/blog/2021/10/06/drycc-workflow-v1.4.0/index.html @@ -0,0 +1,521 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow v1.4.0 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+

Drycc Workflow v1.4.0

+
New Drycc Workflow Release v1.4.0
+ + +

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.

+

Workflow ## v1.3.0 -> v1.4.0

+

Releases

+
    +
  • builder v1.1.0 -> v1.2.0
  • +
  • slugbuilder v1.1.1 -> v1.2.0
  • +
  • dockerbuilder v1.1.1 -> v1.1.2
  • +
  • controller v1.2.1 -> v1.3.0
  • +
  • slugrunner v1.1.1 -> v1.1.2
  • +
  • database v1.0.1 -> v1.0.2
  • +
  • fluentd v1.0.1 -> v1.1.0
  • +
  • redis v1.0.0 -> v1.1.0
  • +
  • logger v1.0.0 -> v1.1.0
  • +
  • minio v1.0.1 -> v1.1.0
  • +
  • monitor v1.0.1 -> v1.1.0
  • +
  • nsqd v1.0.0 -> v1.1.0
  • +
  • registry v1.0.2 -> v1.0.3
  • +
  • registry-proxy v1.0.0 -> v1.0.1
  • +
+

Features

+
    +
  • fc7d93f (builder) - builder: use go-dev
  • +
  • 0c2159e (builder) - builder: fmt code and add create_bucket script
  • +
  • 1b88340 (controller) - controller: remove deprecated api
  • +
  • a92fdeb (controller) - routable: ingress support routable
  • +
  • 1e3eab3 (controller) - maintenance: add maintenance support for ingress
  • +
  • 56b9dd0 (controller) - crt: support containerd-ctr
  • +
  • 5fc3b46 (controller) - controller: add ephemeral-storage restriction
  • +
  • d677e52 (controller) - controller: add a volume command
  • +
  • 5f1323a (controller) - controller:drycc run cmd add –mount para
  • +
  • 74c36a5 (controller) - tasks: add distributed async task
  • +
  • 139c3ca (controller) - tasks: change nsq reader to async
  • +
  • f237d74 (controller) - controller:add drycc resource cmd
  • +
  • 41b46d0 (controller) - controller:add drycc resource cmd improvement
  • +
  • c26f7d8 (controller) - controller: add LimitRanges support
  • +
  • 45b5d1b (controller) - users: add users status api
  • +
  • 4e16f9b (controller) - ps:add ps:stop/start command
  • +
  • c659fa9 (controller) - k8s: add k8s cluster domain
  • +
  • 31a625d (controller) - ps:add ps:stop/start command
  • +
  • 00a779a (fluentd) - fluentd: support containerd log format
  • +
  • f3f1bd4 (fluentd) - nsqd: add stateless nsqd cluster support
  • +
  • db7147c (fluentd) - mirrors: delete aliyun mirrors
  • +
  • 689c12e (logger) - nsqd: add stateless nsqd cluster support
  • +
  • 78ccc5d (logger) - redis: add redis client cluster support
  • +
  • 9843f2c (logger) - k8s: add k8s cluster domain
  • +
  • 6ba122e (minio) - minio: add pvc support
  • +
  • 6973550 (monitor) - monitor: add ingress for monitor
  • +
  • cd73305 (monitor) - charts: add volumeName support
  • +
  • 4769fe9 (monitor) - nsqd: add stateless nsqd cluster support
  • +
  • 87806df (monitor) - k8s: add k8s cluster domain
  • +
  • 4db40c4 (nsqd) - nsqd: add stateless nsqd cluster support
  • +
  • b6f3d4f (nsqd) - nsqd: add stateless nsqd cluster support
  • +
  • 74b85bb (redis) - redis: change redis to statefulset
  • +
  • ff98b50 (slugbuilder) - slugbuilder: delete build hook
  • +
  • b201c2f (slugbuilder) - buildpacks: use drycc buildpacks
  • +
+

Fixes

+
    +
  • 0ec042d (builder) - test: fix test case error
  • +
  • 4fb113b (builder) - build: base image replace by alpine
  • +
  • 443df48 (builder) - minio: fix not bucket error
  • +
  • 3dab5b0 (builder) - minio: create bucket error
  • +
  • 734fca6 (controller) - autoscale: Fix for autoscale on k8s-1.9+ without breaking manual scaling
  • +
  • a7dcd10 (controller) - controller: test pass
  • +
  • 93f0f2e (controller) - controller: fix migrations error
  • +
  • 4724375 (controller) - controller: fix test error
  • +
  • 7bacf29 (controller) - charts: fix clusterrole
  • +
  • 90957f7 (controller) - pod: sort events error
  • +
  • 440b13e (controller) - controller: review table structure
  • +
  • 0a470a6 (controller) - controller: bump tornado 5.1.1
  • +
  • e39218b (controller) - pynsq: no current event loop in thread
  • +
  • 1d8630e (controller) - tests: fix test_task.py run error
  • +
  • 1ff1202 (controller) - controller: fix test case
  • +
  • d8c0da3 (controller) - settings: fix env name
  • +
  • 6d8fd36 (database) - 003_restore_from_backup.sh: ignore script exit 1
  • +
  • e0394a9 (database) - minio: fix not bucket error
  • +
  • f35f252 (database) - mc: fix create_bucket error
  • +
  • 74d6886 (database) - postgres: recovery mode not run
  • +
  • e50d0c1 (dockerbuilder) - caddy: fix caddy not start
  • +
  • f3bec7a (fluentd) - influxdb: fix influxdb host and port
  • +
  • bc19f27 (fluentd) - charts: skipped value for daemon_environment: Not a table
  • +
  • 338d623 (logger) - logger: logger not run in alpine
  • +
  • 7788302 (minio) - minio: bump minio version
  • +
  • 619eed0 (minio) - fix: use go mod replace dep
  • +
  • 3b42122 (monitor) - monitor: fix host error
  • +
  • 67998ef (monitor) - influxdb: replace drycc-monitor-influxapi to drycc-monitor-influx-api
  • +
  • 2cc361c (registry) - registry: fix test case
  • +
  • 548297a (registry) - minio: fix not bucket error
  • +
  • 5412ddb (registry) - minio: create bucket error
  • +
  • d0d629e (slugbuilder) - slugbuilder:fix normalize_storage path
  • +
  • d76ecbe (slugbuilder) - slugbuilder: use v3 api
  • +
  • c505e18 (slugbuilder) - shellcheck: SC2039
  • +
+

Style

+
    +
  • c893a17 (builder) - builder: fmt code
  • +
  • bba5795 (controller) - controller: format code
  • +
  • d36082b (controller) - controller: fix pep8
  • +
  • 66026f2 (controller) - resource: standardize the naming of resource
  • +
  • 03d7e2c (controller) - servicecatalog: change servicecatalog to svcat
  • +
  • 49dbb6d (controller) - controller: flake8 upgrade
  • +
  • cbfc108 (monitor) - monitor: format charts and dashboard
  • +
  • ee85954 (slugbuilder) - slugbuilder: use shellcheck
  • +
  • 3afed2e (slugbuilder) - docker: simplify dockerfile
  • +
  • 36b7f68 (slugrunner) - docker: simplify dockerfile
  • +
+

Maintenance

+
    +
  • 61bb0ef (builder) - aws: upgrade aws sdk version
  • +
  • 0f2e074 (builder) - chore: use go mode replace dep
  • +
  • e9a2219 (builder) - builder: delete glide up
  • +
  • bb8c518 (builder) - registry: del quay.io
  • +
  • fa6d02f (builder) - builder: upgrade go.sum
  • +
  • 9d61e8d (builder) - build: upgrade go.mod
  • +
  • d763a98 (builder) - charts: upgrade k8s newer API versions
  • +
  • d1bc1aa (builder) - pkg: upgrade to new drycc/pkg
  • +
  • 02b1e98 (builder) - builder: update go mod
  • +
  • 8e17d65 (builder) - builder: change alpine repositories
  • +
  • f32b723 (builder) - mirrors: delete aliyun mirrors
  • +
  • e33dc61 (builder) - minio: use bin mc replace docker images
  • +
  • 3ab4f1c (builder) - builder: update controller-sdk-go
  • +
  • b2adfac (builder) - heroku: remove heroku-16 support
  • +
  • f429ac8 (builder) - builder: set GIT_LOCK_TIMEOUT to 30 minutes
  • +
  • 7197c83 (builder) - go.mod:upgrade require pkg controller-sdk-go
  • +
  • 5f3e22d (controller) - deps: bump django from 1.11.21 to 1.11.22 in /rootfs
  • +
  • 1db645a (controller) - deps: bump django from 1.11.22 to 1.11.23 in /rootfs
  • +
  • fbe8067 (controller) - deps: bump django from 1.11.23 to 1.11.29 in /rootfs
  • +
  • 537d667 (controller) - registry: del quay.io
  • +
  • a23c65b (controller) - deps: update all deps to the latest version
  • +
  • 546337e (controller) - charts: upgrade k8s newer API versions
  • +
  • 06023f8 (controller) - workflow-manager: del workflow-manager
  • +
  • bba5736 (controller) - controller: change cluster-issuer location
  • +
  • 6c43661 (controller) - Certificatechange cluster-issuer location
  • +
  • 39a4728 (controller) - controller:change cluster-issuer location del controller-cluster-issuer.yaml
  • +
  • 9e96d3f (controller) - Certificate:upgrade version cert-manager.io/v1alpha2
  • +
  • 8e68049 (controller) - docker: use INDEX_URL replace index.docker.io
  • +
  • 8fda205 (controller) - cert_manager: change cert_manager_enabled to global
  • +
  • 6fefb6d (controller) - charts: change platform_domain to global
  • +
  • 064b2ad (controller) - maintenance: remove maintenance support
  • +
  • b8797c9 (controller) - workflow: remove namespace
  • +
  • 1b20d76 (controller) - quota: add kube quota config
  • +
  • d780075 (controller) - pod: add pod default resources support
  • +
  • 3d72c08 (controller) - rename: rename ingress name
  • +
  • 0aa6ab9 (controller) - mirrors: delete aliyun mirrors
  • +
  • 7533a65 (controller) - heroku: remove heroku-16 support
  • +
  • e5a885d (controller) - controller:check mount volume path
  • +
  • 9014e74 (controller) - test: optimization Dockerfile.test
  • +
  • 0b6ebb2 (controller) - tasks: change apply_async parameters
  • +
  • 835f009 (controller) - wsgi: add tornado 6 support
  • +
  • 67a4ad7 (controller) - utils: use threads replace asyncio
  • +
  • a28949b (controller) - ldap: add AUTH_LDAP_USER_FLAGS_BY_GROUP
  • +
  • a903209 (controller) - charts: add custom controller environment variables support
  • +
  • e0e783e (controller) - ldap: change filter style
  • +
  • d760825 (controller) - scheduler: remove debug log
  • +
  • a25928e (controller) - wsgi: remove a wsgi.py file
  • +
  • 7b2696e (controller) - log: disable nsq.client info log
  • +
  • 8d5c07b (controller) - charts: add default environment
  • +
  • 025f4a2 (controller) - controller: change quota name
  • +
  • ebda60e (controller) - controller: review pvc code
  • +
  • 8832ba9 (controller) - controller: change status\binding model type and mount path check container_types
  • +
  • 7148d04 (controller) - controller: add overcommit cpu and ram support
  • +
  • 4d2087c (controller) - limits: modify limits unit verification
  • +
  • af36970 (controller) - api: check cpu/memory range for api
  • +
  • 329355b (controller) - volumes: modify the volume size
  • +
  • 9dfee09 (controller) - LimitRanges: modify the default limits
  • +
  • 5205bca (controller) - controller: improve the details of certificate
  • +
  • 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • 6415e2c (database) - postgres: upgrade to pg13
  • +
  • 12e6806 (database) - charts: upgrade k8s newer API versions
  • +
  • d294509 (database) - minio: use canary minio test
  • +
  • 1bad02e (database) - mirrors: delete aliyun mirrors
  • +
  • d51420b (database) - minio: use bin mc replace docker images
  • +
  • 4133d05 (dockerbuilder) - dockerbuilder: update caddy and kaniko
  • +
  • 6b4dd18 (dockerbuilder) - minio: use bin mc replace docker images
  • +
  • 6df9b7c (fluentd) - deps-dev: update rake requirement from ~> 10.0 to ~> 12.3
  • +
  • c2490f8 (fluentd) - fluentd: upgrade fluentd
  • +
  • be4a56a (fluentd) - fluentd: add Gemfile.lock
  • +
  • 2237f75 (fluentd) - charts: upgrade k8s newer API versions
  • +
  • c574065 (fluentd) - charts: upgrade k8s newer API versions
  • +
  • 52b8084 (fluentd) - router: delete obsolete router code
  • +
  • 3b3cceb (fluentd) - fluentd: remove manifests dir
  • +
  • 25c6702 (fluentd) - nsqd: change var name
  • +
  • bd571be (fluentd) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS
  • +
  • 72aa4e6 (fluentd) - influxdb: change influxdb service name
  • +
  • bd61903 (logger) - logger: use go mod replace dep
  • +
  • 69c63a1 (logger) - logger: update go.mod
  • +
  • 3aa9cd7 (logger) - registry: del quay.io
  • +
  • f058496 (logger) - nsqd: change var name
  • +
  • 6d9787c (logger) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS
  • +
  • 85ed307 (logger) - logger: standard naming
  • +
  • d88e7b6 (minio) - minio: update minio api to v7
  • +
  • 43715d2 (minio) - minio: upgrade minio
  • +
  • 0e1239b (minio) - minio: use docker.io replace quay.io
  • +
  • f7f047b (minio) - registry: del quay.io
  • +
  • afa7128 (minio) - build: upgrade go.mod
  • +
  • aff2db5 (minio) - charts: upgrade k8s newer API versions
  • +
  • 4547f14 (minio) - pkg: upgrade to new drycc/pkg
  • +
  • 2769b85 (minio) - minio: use bin mc replace docker images
  • +
  • 35dde8d (monitor) - monitor: update grafana influxdb telegraf
  • +
  • 9e3a949 (monitor) - charts: upgrade k8s newer API versions
  • +
  • 6af0432 (monitor) - workflow-manager: remove workflow-manager
  • +
  • 0611c07 (monitor) - router: delete obsolete router code
  • +
  • be04824 (monitor) - cert_manager: change cert_manager_enabled to global
  • +
  • 3780165 (monitor) - charts: change platform_domain to global
  • +
  • 50b04e1 (monitor) - influxdb: remove influxdb admin ui
  • +
  • 6ab4d68 (monitor) - influxdb: remove unuse port
  • +
  • f1510bd (monitor) - monitor: update grafana dashboard,telegraf inputs.kubernetes
  • +
  • f36de2c (monitor) - pvc: upgrade to new format
  • +
  • fc78a0a (monitor) - workflow: remove namespace
  • +
  • e85890f (monitor) - monitor: monitoring nsqd and redis separately
  • +
  • 694f6b1 (monitor) - mirrors: delete aliyun mirrors
  • +
  • 4aea36a (monitor) - grafana: add ldap support for grafana
  • +
  • 68fc30f (nsqd) - nsq: update nsq
  • +
  • 16f32aa (nsqd) - charts: upgrade k8s newer API versions
  • +
  • 04db389 (redis) - reids: update to redis 6
  • +
  • 3f01bab (redis) - charts: upgrade k8s newer API versions
  • +
  • 647e4be (registry) - registry: del quay.io
  • +
  • 0bbce99 (registry) - charts: upgrade k8s newer API versions
  • +
  • a982b50 (registry) - minio: use bin mc replace docker images
  • +
  • e088da3 (registry-proxy) - ingress: renmae use_native_ingress to use_ingress
  • +
  • 7e88337 (registry-proxy) - nginx: upgrade nginx to mainline
  • +
  • 7204d72 (registry-proxy) - registry: optimizing variable naming
  • +
  • 2eafc59 (registry-proxy) - registry-proxy: update nginx
  • +
  • 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions
  • +
  • c72db96 (registry-proxy) - registry-proxy: change travis icon url
  • +
  • ca9f962 (slugbuilder) - slugbuilder: del BUILDPACK_URL support
  • +
  • 1b74dd5 (slugbuilder) - slugbuilder: add heroku-20 support
  • +
  • 54d4ad2 (slugbuilder) - slugbuilder: del quay.io
  • +
  • a78f37e (slugbuilder) - slugbuilder: add heroku-20 stack
  • +
  • 94ac94a (slugbuilder) - minio: use bin mc replace docker images
  • +
  • 53b4b8b (slugbuilder) - slugbuilder: modify stack priority
  • +
  • 58e2bd2 (slugbuilder) - dockerfile: add WORKDIR /tmp
  • +
  • b29cd04 (slugbuilder) - slugbuilder: add pre_build.sh
  • +
  • 9d319f6 (slugbuilder) - slugbuilder: silent mc command output
  • +
  • d1ec3c9 (slugbuilder) - heroku: remove heroku-16 support
  • +
  • 5048534 (slugbuilder) - slugbuilder: use drycc stack-images
  • +
  • a116537 (slugrunner) - slugrunner: add heroku-20 support
  • +
  • a1196bf (slugrunner) - slugrunner: del quay.io
  • +
  • 64c96d7 (slugrunner) - slugrunner: add heroku-20 stack
  • +
  • cc3e226 (slugrunner) - minio: use bin mc replace docker images
  • +
  • 9130bde (slugrunner) - shellcheck: shellcheck installer
  • +
  • 4ea33e1 (slugrunner) - slugrunner: modify stack priority
  • +
  • 5514e8b (slugrunner) - heroku: remove heroku-16 support
  • +
  • be829fb (slugrunner) - slugrunner: use drycc stack-images
  • +
  • e1e06be (slugrunner) - slugrunner: remove Dockerfile.heroku-16
  • +
+ + + + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/2022/10/06/drycc-workflow-v1.5.0/index.html b/blog/2022/10/06/drycc-workflow-v1.5.0/index.html new file mode 100644 index 000000000..8fa2128cc --- /dev/null +++ b/blog/2022/10/06/drycc-workflow-v1.5.0/index.html @@ -0,0 +1,589 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow v1.5.0 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+

Drycc Workflow v1.5.0

+
New Drycc Workflow Release v1.5.0
+ + +

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.

+

Workflow ## v1.4.0 -> v1.5.0

+

Releases

+
    +
  • passport v1.0.0
  • +
  • rabbitmq v1.0.0
  • +
  • imagebuilder v1.0.0
  • +
  • builder v1.2.0 -> v1.3.0
  • +
  • controller v1.3.0 -> v1.4.0
  • +
  • database v1.0.2 -> v1.1.0
  • +
  • fluentd v1.1.0 -> v1.2.0
  • +
  • redis v1.1.0 -> v1.2.0
  • +
  • influxdb v1.0.1 -> v1.1.0
  • +
  • logger v1.1.0 -> v1.2.0
  • +
  • minio v1.1.0 -> v1.2.0
  • +
  • monitor v1.1.0 -> v1.2.0
  • +
  • nsqd v1.1.0 -> v1.2.0
  • +
  • registry v1.0.3 -> v1.1.0
  • +
  • registry-proxy v1.0.2 -> v1.1.0
  • +
+

Features

+
    +
  • 0f5f8e4 (builder) - builder: multi-platform support
  • +
  • f269d06 (builder) - build: add buildx supportjkjkk:q
  • +
  • 5e72fe8 (builder) - registry: use docker build
  • +
  • 25d8a4c (builder) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 7a3e1c5 (builder) - charts: set the default chart version
  • +
  • 46b75ff (builder) - builder: add cloud native buildpacks support
  • +
  • 2db2054 (builder) - builder: unified build model
  • +
  • 4b7f9d9 (builder) - builder: add initContainers
  • +
  • b78c936 (controller) - token: add get token api
  • +
  • bac52a5 (controller) - tasks: use celery replace nsqd
  • +
  • b9b0c58 (controller) - build: add buildx support
  • +
  • 205dcb3 (controller) - influxdb: add influxdb client
  • +
  • ff15849 (controller) - influxdb: upgrade to influxdb 2.x
  • +
  • 4016244 (controller) - controller: push data to influx
  • +
  • fcfce2e (controller) - workflow-manager: add workflow-manager support
  • +
  • 00e9bfb (controller) - influxdb: review influxdb code
  • +
  • dd644d5 (controller) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 118278b (controller) - charts: set the default chart version
  • +
  • 122a9cd (controller) - oauth2: add oauth2 support
  • +
  • 559a5b6 (controller) - controller: use cncf buildpacks replace slugrunner
  • +
  • 96130e6 (controller) - charts: database configuration optimization of passport and controller
  • +
  • 2ea8508 (controller) - oauth: using passport authentication
  • +
  • 868c437 (database) - database: multi-platform support
  • +
  • eadd5da (database) - build: add buildx support
  • +
  • b6eea4c (database) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 04a88db (database) - charts: set the default chart version
  • +
  • 92ed309 (database) - database: add initContainer
  • +
  • ee6b78f (fluentd) - build: add buildx support
  • +
  • f523e30 (fluentd) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • ee47b53 (fluentd) - charts: set the default chart version
  • +
  • 80a51af (influxdb) - influxdb: modify influxdb naming rules
  • +
  • fb10030 (influxdb) - influxdb: use influxdb v2
  • +
  • 0e87ad8 (influxdb) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 9d10801 (influxdb) - charts: set the default chart version
  • +
  • d825c9f (logger) - build: add buildx support
  • +
  • b139576 (logger) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 88f84ea (logger) - charts: set the default chart version
  • +
  • 5ccae3e (logger) - dockerfile: remove chmod cmd
  • +
  • 193aefc (logger) - logger: add initContainers
  • +
  • baee330 (minio) - minio: multi-platform support
  • +
  • ad5d055 (minio) - build: add buildx support
  • +
  • 19868d4 (minio) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 4bd84b8 (minio) - charts: set the default chart version
  • +
  • 79d1f2f (monitor) - database: multi-platform support
  • +
  • 88e5a7f (monitor) - build: add buildx support
  • +
  • 5672e99 (monitor) - influxdb: modify influxdb naming rules
  • +
  • 8672103 (monitor) - influxdb: use influxdb v2
  • +
  • 66cb4c8 (monitor) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 9576eb3 (monitor) - charts: set the default chart version
  • +
  • 30809c9 (monitor) - monitor: add initContainers
  • +
  • 70d140c (nsqd) - nsqd: using self compiled nsq binary
  • +
  • 1073d4f (nsqd) - nsqd: use GOPATH replace /go
  • +
  • e498480 (nsqd) - build: add buildx support
  • +
  • cf9b7d5 (nsqd) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • c335856 (nsqd) - charts: set the default chart version
  • +
  • efba713 (redis) - build: add buildx support
  • +
  • c7a3b53 (redis) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 4cdad7b (redis) - charts: set the default chart version
  • +
  • 652b443 (registry) - registry: multi-platform support
  • +
  • 4060176 (registry) - registry: use docker build
  • +
  • 7102a03 (registry) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 6c8600d (registry) - charts: set the default chart version
  • +
  • 33a51c9 (registry) - registry: add initContainers
  • +
  • bef70dc (registry-proxy) - build: add buildx support
  • +
  • d2319c1 (registry-proxy) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 02fafed (registry-proxy) - charts: set the default chart version
  • +
+

Fixes

+
    +
  • 5499c9a (controller) - gunicorn: gunicorn not running
  • +
  • 06e9e88 (controller) - controller: error loading shared library
  • +
  • 01b5bd0 (controller) - controller: upgrade celery config
  • +
  • 6e32d55 (controller) - controller: fix update resources bug
  • +
  • 0e0d53f (controller) - chart: set the domain depends certManagerEnabled
  • +
  • 2ac4ca8 (controller) - passport: error loading shared library libexpat.so.1
  • +
  • a0dd517 (fluentd) - fluentd: drone build
  • +
  • 6eca2a3 (logger) - logger: golang lint
  • +
  • 63b0aa0 (registry) - drone: charts url error
  • +
+

Docs

+
    +
  • 472cfcc (controller) - controller organize README.md document
  • +
  • d9d6e29 (redis) - redis: delete links that do not exist
  • +
+

Test case

+
    +
  • 1468f57 (controller) - controller: add command unittest
  • +
+

Maintenance

+
    +
  • 9999bfd (builder) - builder:replace the special words
  • +
  • cda8b58 (builder) - builder: remove docker keyword from charts
  • +
  • dc575dd (builder) - builder: use imagebuilder replace dockerbuilder
  • +
  • d3bb183 (builder) - docker: use the full name of registry
  • +
  • 5fe34d1 (builder) - travis: add DEV_REGISTRY
  • +
  • 7e36453 (builder) - CICD: use drone
  • +
  • 52b8d9d (builder) - drone: add image_registries volumes
  • +
  • 65963f4 (builder) - k8s: add privileged to dind
  • +
  • d345fcf (builder) - LICENSE: revert modifications to Apache license
  • +
  • 7975c99 (builder) - drone: always pull image
  • +
  • 59633dd (builder) - builder: modify launch imagebuild pod
  • +
  • 8d14e67 (builder) - builder: use Procfile in anywhere
  • +
  • 5357fa8 (builder) - go: bump go mod
  • +
  • 8d26ac0 (builder) - k8s: k8s deprecated api migration
  • +
  • 0af620d (builder) - chars: change org to imageTag
  • +
  • ae84303 (builder) - builder: run imagebuider replace pod with job
  • +
  • 3b2c496 (builder) - builder: change docs website
  • +
  • 5679a4c (builder) - builder: upgrade to golang1.17
  • +
  • a214503 (controller) - controller:replace whitelist with allowlist
  • +
  • 375ddcc (controller) - ps:drycc ps:list show autoscale num
  • +
  • c32e409 (controller) - ldap: canot register when ldap is enabled
  • +
  • c46580a (controller) - controller:modify redis config
  • +
  • fa9e87b (controller) - chart:modify controller charts
  • +
  • 6f9fd08 (controller) - nsq: remove nsq
  • +
  • 994b2dc (controller) - docker-buildx: add check-docker
  • +
  • a720c3a (controller) - controller: remove docker keyword from charts
  • +
  • e9a5c84 (controller) - docker: use the full name of registry
  • +
  • a26614a (controller) - controller: add rabbitmq env
  • +
  • 3df229d (controller) - controller: modify database config && remove redis port config && add env prefix with DRYCC
  • +
  • 257e94b (controller) - controller: CELERY_BROKER use rabbitmq and modify celery-deployment cronjob
  • +
  • f4d6ec3 (controller) - chart: pretty chart format
  • +
  • 63e6195 (controller) - influxdb: modify influxdb code
  • +
  • 0f6d408 (controller) - CICD: use drone
  • +
  • 87bad28 (controller) - python: upgrade to python3.9
  • +
  • e8f7560 (controller) - volumes: modify mount summary
  • +
  • 6cf6c6b (controller) - drone: add image_registries volumes
  • +
  • a9397e8 (controller) - oauth: modify token Authentication
  • +
  • c7f8c8b (controller) - deps: bump django from 2.2.14 to 2.2.18 in /rootfs
  • +
  • a1a08aa (controller) - deps: bump djangorestframework from 3.11.0 to 3.11.2 in /rootfs
  • +
  • efd78b4 (controller) - deps: bump django from 2.2.18 to 2.2.20 in /rootfs
  • +
  • 649b044 (controller) - deps: bump django from 2.2.20 to 2.2.22 in /rootfs
  • +
  • 41b742b (controller) - deps: bump django from 2.2.22 to 2.2.24 in /rootfs
  • +
  • 22ffe5d (controller) - LICENSE: revert modifications to Apache license
  • +
  • c98b468 (controller) - drone: always pull image
  • +
  • 20e6edb (controller) - chart: modify the problem of using buildpack
  • +
  • db16879 (controller) - controller: pretty pods list print
  • +
  • ba6f456 (controller) - test: pretty pods list print
  • +
  • 5fce4b7 (controller) - k8s: k8s deprecated api migration
  • +
  • e9e0bcb (controller) - oauth: using passport authentication
  • +
  • 0311172 (controller) - chars: change org to imageTag
  • +
  • 150eff1 (controller) - charts: update cert-manager api version
  • +
  • de8545a (controller) - controller: update requirements
  • +
  • 1442207 (controller) - controller: using django native JSONFiled
  • +
  • ab4e836 (controller) - oauth: modify passport api
  • +
  • 5c54e06 (controller) - controller: eliminate pip warnings
  • +
  • 870328d (controller) - controller: remove entrypoint
  • +
  • 5e5e6ae (controller) - controller: upgrade celery config
  • +
  • 607778f (controller) - controller: add initContainer
  • +
  • 23dc016 (controller) - chart: set the domain depends certManagerEnabled
  • +
  • f3cf20b (controller) - controller: remove default bash env
  • +
  • 73f2636 (controller) - controller: modify alpinelinux repositories
  • +
  • 498e9f2 (controller) - chart: change certManagerEnabled to boolean type
  • +
  • 27f5308 (controller) - passport: exclude cryptography
  • +
  • 370b75d (controller) - controller: use sh env
  • +
  • 07585b4 (database) - postgres:replace the special words
  • +
  • 20172dc (database) - database: remove docker keyword from charts
  • +
  • abb9b88 (database) - docker: use the full name of registry
  • +
  • e72f58f (database) - chart: modify the off-cluster database
  • +
  • a91f64f (database) - travis: add DEV_REGISTRY
  • +
  • 614fb76 (database) - tests: use add-host replace link
  • +
  • a3428f3 (database) - CICD: use drone
  • +
  • 239fef1 (database) - drone: add image_registries volumes
  • +
  • 42858e1 (database) - LICENSE: revert modifications to Apache license
  • +
  • d0fe850 (database) - drone: always pull image
  • +
  • 34a36ad (database) - charts: Nn secret is generated during off-cluster
  • +
  • 064ccf4 (database) - database: create database
  • +
  • 9228992 (database) - chars: change org to imageTag
  • +
  • 9f7810c (database) - database: upgrade to wal-g v1.1
  • +
  • 05783f4 (fluentd) - fluentd:replace the special words
  • +
  • 0739809 (fluentd) - influxdb:replace monitor-influx with influx
  • +
  • f02487c (fluentd) - fluentd: remove docker keyword from charts
  • +
  • 2c96cc0 (fluentd) - docker: use the full name of registry
  • +
  • b20c429 (fluentd) - charts: remove port config
  • +
  • 6dd0197 (fluentd) - travis: add DEV_REGISTRY
  • +
  • c5bec51 (fluentd) - CICD: use drone
  • +
  • f8524b7 (fluentd) - drone: add image_registries volumes
  • +
  • a50878a (fluentd) - LICENSE: revert modifications to Apache license
  • +
  • 14fe20e (fluentd) - drone: always pull image
  • +
  • 4a2f660 (fluentd) - k8s: k8s deprecated api migration
  • +
  • de2dd91 (fluentd) - chars: change org to imageTag
  • +
  • a9f1944 (fluentd) - fluentd: upgrade to fluentd1.14
  • +
  • 7cb4e95 (influxdb) - influxdb: change username to user
  • +
  • 0fdc21b (influxdb) - influxdb: remove docker keyword from charts
  • +
  • b2acddb (influxdb) - influxdb: change default path
  • +
  • ba88919 (influxdb) - influxdb: add check_env function
  • +
  • 9117401 (influxdb) - influxdb: modify init_influxdb has_bucket
  • +
  • 092a3e6 (influxdb) - chart: pod not readiness
  • +
  • 51de380 (influxdb) - travis: add DEV_REGISTRY
  • +
  • 66d7667 (influxdb) - docker: replace influxdb base image
  • +
  • 3aa3094 (influxdb) - CICD: use drone
  • +
  • 14b9c24 (influxdb) - drone: add image_registries volumes
  • +
  • 02b4cd1 (logger) - logger:replace the special words
  • +
  • 114b5d5 (logger) - reids: delete the logger prefix of redis
  • +
  • 639278a (logger) - redis: remove logger from redis conf
  • +
  • 90195e2 (logger) - go: remove GOOS and GOARCH
  • +
  • 31e2e27 (logger) - logger: remove docker keyword from charts
  • +
  • 8fbd9fa (logger) - docker: use the full name of registry
  • +
  • b39df2d (logger) - charts: remove redis\nsqd port config
  • +
  • 35d6d07 (logger) - travis: add DEV_REGISTRY
  • +
  • 69aabf5 (logger) - tests: remove docker link
  • +
  • e916644 (logger) - CICD: use drone
  • +
  • d6872b7 (logger) - drone: add image_registries volumes
  • +
  • 37801da (logger) - LICENSE: revert modifications to Apache license
  • +
  • cfb4b38 (logger) - drone: always pull image
  • +
  • 8bda3bf (logger) - go: bump go mod
  • +
  • e13ebfc (logger) - chars: change org to imageTag
  • +
  • 38e6d8d (minio) - minio:replace the special words
  • +
  • d6925dd (minio) - minio: remove docker keyword from charts
  • +
  • d56bc39 (minio) - docker: use the full name of registry
  • +
  • e4696cc (minio) - travis: add DEV_REGISTRY
  • +
  • 70c5c79 (minio) - minio: use latest version
  • +
  • 773cf6c (minio) - Makefile: remove DEV_REGISTRY ?=
  • +
  • 5ce5bc6 (minio) - CICD: use drone
  • +
  • 5da8be3 (minio) - drone: add image_registries volumes
  • +
  • c1f0611 (minio) - LICENSE: revert modifications to Apache license
  • +
  • b73f792 (minio) - drone: always pull image
  • +
  • 79d1c93 (minio) - go: bump go mod
  • +
  • c448899 (minio) - chars: change org to imageTag
  • +
  • 15ee49e (minio) - minio: migrate deprecated warning
  • +
  • 9968a1a (minio) - minio: upgrade to golang1.7
  • +
  • 14fedd2 (monitor) - monitor:replace the special works
  • +
  • 52c431a (monitor) - reids: delete the logger prefix of redis
  • +
  • 2c95b47 (monitor) - redis: remove logger from redis conf
  • +
  • da9bc56 (monitor) - monitor:remove influxdb
  • +
  • 53f47b9 (monitor) - grafana: use grafana docker image
  • +
  • 5bdb188 (monitor) - grafana: use grafana docker image
  • +
  • c0586dd (monitor) - monitor: remove docker keyword from charts
  • +
  • 87d02b6 (monitor) - charts: add nodes and persistentvolumes rule
  • +
  • 1b5598f (monitor) - monitor: modify grafana dashboard with FLUX and pretty config.toml
  • +
  • bcbc0d5 (monitor) - docker: use the full name of registry
  • +
  • 9418c9e (monitor) - monitor: fix upload dashboard error and modify INFLUXDB input
  • +
  • 589f29a (monitor) - travis: add DEV_REGISTRY
  • +
  • f776f8a (monitor) - CICD: use drone
  • +
  • 6ca3060 (monitor) - drone: add image_registries volumes
  • +
  • 6a9ffb2 (monitor) - LICENSE: revert modifications to Apache license
  • +
  • 45e41ed (monitor) - drone: always pull image
  • +
  • 654d407 (monitor) - k8s: k8s deprecated api migration
  • +
  • 41e9b9c (monitor) - chars: change org to imageTag
  • +
  • 99c10d3 (monitor) - charts: update cert-manager api version
  • +
  • 9bf83c4 (monitor) - oauth: user oauth passport
  • +
  • a128f6d (monitor) - chart: change certManagerEnabled to boolean type
  • +
  • 8f897fe (monitor) - chart: set the domain depends certManagerEnabled
  • +
  • ba6d793 (nsqd) - README:update travis build status
  • +
  • 49879c4 (nsqd) - nsqd: minimum git clone code
  • +
  • c5e2680 (nsqd) - nsqd: remove docker keyword from charts
  • +
  • 21dd17b (nsqd) - docker: use the full name of registry
  • +
  • 7d86b3c (nsqd) - charts: remove port config
  • +
  • c073d95 (nsqd) - travis: add DEV_REGISTRY
  • +
  • 55c297c (nsqd) - CICD: use drone
  • +
  • 165c2ae (nsqd) - drone: add image_registries volumes
  • +
  • 9c6a1f8 (nsqd) - LICENSE: revert modifications to Apache license
  • +
  • 9283098 (nsqd) - drone: always pull image
  • +
  • 46acf8a (nsqd) - k8s: k8s deprecated api migration
  • +
  • 43caf80 (nsqd) - chars: change org to imageTag
  • +
  • 6897471 (nsqd) - nsqd: use official image
  • +
  • 297bc05 (redis) - redis:replace the special words
  • +
  • f5f8b5e (redis) - reids: delete the logger prefix of redis
  • +
  • af7b657 (redis) - redis: change logger-redis to redis
  • +
  • 8dca154 (redis) - redis: remove logger from redis conf
  • +
  • eaeda2d (redis) - redis: remove docker keyword from charts
  • +
  • 53c6358 (redis) - docker: use the full name of registry
  • +
  • ae37416 (redis) - charts: remove port config
  • +
  • e985656 (redis) - travis: add DEV_REGISTRY
  • +
  • 423336a (redis) - CICD: use drone
  • +
  • be64ab4 (redis) - drone: add image_registries volumes
  • +
  • 3bec735 (redis) - LICENSE: revert modifications to Apache license
  • +
  • 4f934f6 (redis) - drone: always pull image
  • +
  • 359b878 (redis) - chars: change org to imageTag
  • +
  • 83b8ac2 (registry) - workflow:replace the special words
  • +
  • 869b280 (registry) - registry: remove docker keyword from charts
  • +
  • 999c1e9 (registry) - docker: use the full name of registry
  • +
  • 5652da9 (registry) - travis: add DEV_REGISTRY
  • +
  • cc8c6c2 (registry) - CICD: use drone
  • +
  • c7bdbd0 (registry) - CICD: pretty .drone.yaml format
  • +
  • 5c55a38 (registry) - test: use add-host replace link
  • +
  • f8866f3 (registry) - drone: add image_registries volumes
  • +
  • 6c8292f (registry) - LICENSE: revert modifications to Apache license
  • +
  • 1d50f2c (registry) - drone: always pull image
  • +
  • efbca6d (registry) - chars: change org to imageTag
  • +
  • 2eafc59 (registry-proxy) - registry-proxy: update nginx
  • +
  • 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions
  • +
  • c72db96 (registry-proxy) - registry-proxy: change travis icon url
  • +
  • 63ffb92 (registry-proxy) - registry-proxy:replace the special works
  • +
  • 1d904a6 (registry-proxy) - registry-proxy: remove docker keyword from charts
  • +
  • c8200b1 (registry-proxy) - docker: use the full name of registry
  • +
  • d3fa939 (registry-proxy) - travis: add DEV_REGISTRY
  • +
  • 5a8b353 (registry-proxy) - CICD: use drone
  • +
  • 703d05a (registry-proxy) - drone: add image_registries volumes
  • +
  • aa71db1 (registry-proxy) - LICENSE: revert modifications to Apache license
  • +
  • 710c126 (registry-proxy) - drone: always pull image
  • +
  • 2dcc5e6 (registry-proxy) - chars: change org to imageTag
  • +
+ + + + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/2022/10/21/drycc-workflow-v1.6.0/index.html b/blog/2022/10/21/drycc-workflow-v1.6.0/index.html new file mode 100644 index 000000000..d7da93e31 --- /dev/null +++ b/blog/2022/10/21/drycc-workflow-v1.6.0/index.html @@ -0,0 +1,733 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow v1.6.0 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+

Drycc Workflow v1.6.0

+
New Drycc Workflow Release v1.6.0
+ + +

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.

+

Workflow ## v1.5.0 -> v1.6.0

+

Releases

+
    +
  • builder v1.3.0 -> v1.4.0
  • +
  • controller v1.4.0 -> v1.5.0
  • +
  • passport v1.0.0 -> v1.1.0
  • +
  • database v1.1.0 -> v1.2.0
  • +
  • imagebuilder v1.0.1 -> v1.1.0
  • +
  • fluentd v1.2.0 -> v1.3.0
  • +
  • logger v1.2.0 -> v1.3.0
  • +
  • storage v1.2.0 -> v1.3.0
  • +
  • monitor v1.2.0 -> v1.3.0
  • +
  • redis v1.2.0 -> v1.3.0
  • +
  • influxdb v1.1.0 -> v1.2.0
  • +
  • rabbitmq v1.0.0 -> v1.1.0
  • +
  • registry v1.1.0 -> v1.2.0
  • +
  • registry-proxy v1.1.0 -> v1.2.0
  • +
+

Features

+
    +
  • 52517d9 (builder) - builder: update controller-sdk-go
  • +
  • 1d78ca0 (builder) - builder: add affinity
  • +
  • 26b6980 (builder) - builder: switch charts to oci
  • +
  • bfd4385 (controller) - controller: add get manager user status
  • +
  • 874208d (controller) - controller: unified measurement model
  • +
  • cadf98f (controller) - controller: add admission webhook
  • +
  • e0050c2 (controller) - controller: new measurement model
  • +
  • a11ba58 (controller) - controller: multi pod restart uses async
  • +
  • fb3c15d (controller) - controller: add check app owner status
  • +
  • 3d78b76 (controller) - controller: add resource services api
  • +
  • 3d6a201 (controller) - controller: add search apps api
  • +
  • 01c443a (controller) - controller: add KUBERNETES_CPU_MEMORY_RATIO parameter
  • +
  • 7c26232 (controller) - controller: add volume size limit
  • +
  • 3bee749 (controller) - controller: add annotations support
  • +
  • 23cd97c (controller) - controller: traefik v2 support
  • +
  • e37b7db (controller) - controller: add affinity
  • +
  • b3b367b (controller) - controller: add volume expand support
  • +
  • a4e154a (controller) - controller: add database replica support
  • +
  • 2f37216 (controller) - controller: switch wsgi to asgi
  • +
  • b3314a5 (controller) - controller: add pod exec api
  • +
  • 75df2dc (controller) - controller: add stream support for app logs
  • +
  • 4229bad (controller) - ccontroller: switch charts to oci
  • +
  • 89bb19b (database) - database: upgrade to pg14
  • +
  • 9f45a5d (database) - database: add hugepages support
  • +
  • c4008c9 (database) - database: add affinity
  • +
  • 411a7b2 (database) - postgres: use patroni
  • +
  • 64e5cb0 (database) - database: switch charts to oci
  • +
  • 2bab823 (fluentd) - fluentd: switch charts to oci
  • +
  • 337ba62 (imagebuilder) - imagebuilder: run podman as rootless
  • +
  • 4396ffa (imagebuilder) - imagebuilder: switch to oci charts
  • +
  • f37ae09 (influxdb) - influxdb: add affinity
  • +
  • 04503b2 (influxdb) - influxdb: add influxdb ha
  • +
  • 41ddad5 (influxdb) - influxdb: switch charts to oci
  • +
  • 2006480 (logger) - logger: use redis stream replace nsqd
  • +
  • ab23d17 (logger) - logger: add affinity
  • +
  • 81d4e9d (logger) - logger: switch charts to oci
  • +
  • c3d9796 (monitor) - monitor: add affinity
  • +
  • cd9de3c (monitor) - monitor: switch to oci charts
  • +
  • 318a73f (passport) - passport: add change user confirm
  • +
  • 79ef100 (passport) - passport: add re login at authorize
  • +
  • 6927bb5 (passport) - passport: add affinity
  • +
  • 3146a09 (passport) - passport: add google reCAPTCHA
  • +
  • 802abcd (passport) - passport: add replica database support
  • +
  • a0dcd1b (passport) - passport: switch wsgi to asgi
  • +
  • 4c9dbba (passport) - passport: switch charts to oci
  • +
  • 74825f7 (rabbitmq) - rabbitmq: add rabbitmq managentment ingress
  • +
  • 12cf7d6 (rabbitmq) - rabbitmq: add affinity
  • +
  • 103417d (rabbitmq) - rabbitmq: switch charts to oci
  • +
  • 5d428bb (redis) - redis: add affinity
  • +
  • a88c1a9 (redis) - redis: switch charts to oci
  • +
  • 541585d (registry) - registry: add affinity
  • +
  • e9ca9d4 (registry) - registry: add garbage-collect cronjob
  • +
  • ec62a59 (registry) - registry: switch charts to oci
  • +
  • fde0b07 (registry-proxy) - registry-proxy: switch charts to oci
  • +
  • be14eb4 (storage) - minio: add affinity
  • +
  • 51af696 (storage) - storage: add k8s csi support
  • +
  • 76a75d9 (storage) - storage: add cluster health checker
  • +
  • a17dc8c (storage) - storage: switch charts to oci
  • +
+

Fixes

+
    +
  • e4f44fb (builder) - builder: no error return
  • +
  • e38dfc7 (builder) - builderControllerHost/ControllerPort init error
  • +
  • ff9069f (controller) - controller: influxdb query error
  • +
  • f7f5069 (controller) - controller: authentication 500
  • +
  • 7e297a8 (controller) - controller: add check remote user status
  • +
  • 9db28e1 (controller) - controller: celery MaxRetriesExceededError
  • +
  • 4bcff08 (controller) - controller: wrong name
  • +
  • d69fde2 (controller) - controller: traefik ingress create error
  • +
  • a3ad743 (controller) - fixup(controller: user login error
  • +
  • 662c8dd (controller) - controller: change influxdb port
  • +
  • 957bdf6 (controller) - controller: validate rsa key pairing before storage
  • +
  • 419ec4c (controller) - controller: kubernetes pod/exec cluster role
  • +
  • a67edaa (controller) - controller: Cannot routing:disable
  • +
  • e09e214 (controller) - controller: allowlist cannot remove
  • +
  • 318b126 (controller) - controller: domains update error
  • +
  • 92855eb (database) - database: premission denied
  • +
  • bde945a (database) - fixup(postgres: support arm, fix Failed to build psutil
  • +
  • 7854d45 (database) - fixup(postgres: user name converted to lowercase letters
  • +
  • 57b2a07 (fluentd) - fluentd: ifconfig_path not found
  • +
  • 20e72b9 (imagebuilder) - imagebuilder: upgrade pack version
  • +
  • 651db8a (imagebuilder) - imagebuilder: chown uid gid order
  • +
  • d2e9164 (influxdb) - influxdb: proxy not running
  • +
  • 3a1d361 (monitor) - monitor: charts naming
  • +
  • d754ae0 (monitor) - monitor: telegraf init error
  • +
  • 63f9e34 (monitor) - monitor: affinity error
  • +
  • 95ae1e5 (passport) - passport: yarn build fail
  • +
  • 3f5365e (passport) - passport: wrong name
  • +
  • 907f17b (passport) - passport: change uid gid to 1001
  • +
  • e3911e0 (passport) - passport: ‘registration_done’ not found
  • +
  • 2ace5f0 (passport) - passport: ui style
  • +
  • b3ba1e1 (passport) - passport privacy policy link
  • +
  • 172e9c8 (passport) - passport: check databaseReplicaUrl error
  • +
  • a3aeb70 (rabbitmq) - passport: change uid gid to 1001
  • +
  • 5c73dcf (redis) - reids: DRYCC_REGISTY misspelling
  • +
  • d7e3baf (redis) - redis: env miss
  • +
  • cadaa91 (registry) - registry: set gid uid to 1001
  • +
  • d524217 (registry) - registry: storage run error
  • +
  • 854f912 (registry) - registry: chown uid gid order
  • +
  • e642bb7 (registry-proxy) - registry-proxy: containerPort error
  • +
  • 8dfd029 (registry-proxy) - registry-proxy: chown uid gid order
  • +
  • bbea364 (storage) - minio: premission denied
  • +
  • 97deba1 (storage) - storage: node unimplemented error
  • +
  • b9bdeff (storage) - storage: pd can not connect each other
  • +
+

Style

+
    +
  • 1edb10c (controller) - controller: database convention over configuration
  • +
  • 1960cc3 (database) - database: database name convention over configuration
  • +
  • 06d1f5d (imagebuilder) - imagebuilder: URL to Url
  • +
  • b8a8941 (passport) - passport: database convention over configuration
  • +
+

Maintenance

+
    +
  • 8e9a199 (builder) - builder: upgrade controller-sdk-go
  • +
  • 4840151 (builder) - builder: use exec runner replace docker runner
  • +
  • 68ccfb1 (builder) - builder: canonical charts naming
  • +
  • 8f971cb (builder) - builder: provide any additional service annotations
  • +
  • fe2c55d (builder) - dockerfile: use drycc/base image
  • +
  • 2b5e706 (builder) - dockerfile: change user and workdir
  • +
  • 7a6c8d3 (builder) - builder: set gid uid to 1001
  • +
  • fe494f7 (builder) - dockerfile: use uid gid
  • +
  • a7c8752 (builder) - builder: change nodes to pod affinity
  • +
  • eb2e94c (builder) - database: bump mc 2022.04.01.23.44.48
  • +
  • cfaae66 (builder) - builder: use registry.drycc.cc replace docker.io
  • +
  • d7d2890 (builder) - builder: change default imagebuilder registry
  • +
  • ecfdb19 (builder) - imagebuilder: change python-dev registry
  • +
  • 6da17f4 (builder) - builder: https://github.com/minio/minio/issues/14331
  • +
  • 1a57e5b (builder) - builder: https://github.com/minio/minio/issues/14331
  • +
  • f1464fa (builder) - builder: https://github.com/minio/minio/issues/13799
  • +
  • b1e1c4f (builder) - builder: use env replace creds volume
  • +
  • 71a4145 (builder) - builder: bump go.mod
  • +
  • 3567688 (builder) - builder: fine management affinity
  • +
  • 73ea38b (builder) - builder: change storage to minio
  • +
  • 1f91321 (builder) - builder: use testify replace assert
  • +
  • d148b9c (builder) - builder: add check storage health
  • +
  • b768101 (builder) - builder: change initContainers
  • +
  • 1b3bec3 (builder) - builder: add replicas
  • +
  • 5cb0d61 (builder) - builder: upgrade to latest controller-sdk-go
  • +
  • 98b9d58 (builder) - builder: upgrade new require
  • +
  • 65817c3 (builder) - builder: change drycc.cc to www.drycc.cc
  • +
  • 4e3f9d0 (controller) - controller: add celery retry mechanism
  • +
  • f6716fe (controller) - controller: change cronjob name
  • +
  • eb60693 (controller) - controller: refine celery task priority
  • +
  • 66905e9 (controller) - controller: change manager auth
  • +
  • ea20c41 (controller) - controller: remove start/stop api
  • +
  • 4c8fc80 (controller) - controller: improve tasks error handling
  • +
  • cf7402e (controller) - controller: add blocklist api
  • +
  • 80f14dd (controller) - controller: use get_user_model replace auth.User
  • +
  • ffc7bb7 (controller) - controller: use JSONField replace ArrayField
  • +
  • 370df8c (controller) - controller: add validate metric
  • +
  • 29084ce (controller) - controller: use user id request manager api
  • +
  • 718fe12 (controller) - controller change urlpatterns order
  • +
  • 71f4042 (controller) - controller: measurements uses lowercase letters
  • +
  • e5123ea (controller) - controller: change resource unit to number
  • +
  • 18fee9a (controller) - deps: bump celery from 5.1.2 to 5.2.2 in /rootfs
  • +
  • ffca6c1 (controller) - controller: use exec runner replace docker runner
  • +
  • 9ec12e1 (controller) - controller: simplify drone configuration
  • +
  • 4b4749e (controller) - controller: set default CSRF_COOKIE_SECURE false
  • +
  • 2ef6338 (controller) - deps: bump django from 3.2.5 to 3.2.10 in /rootfs
  • +
  • c7570d0 (controller) - deps: bump django from 3.2.10 to 3.2.11 in /rootfs
  • +
  • 8b17bc1 (controller) - controller: canonical charts naming
  • +
  • c928fb0 (controller) - controller: use rabbitmq cluster
  • +
  • f917185 (controller) - controller: provide any additional service annotations
  • +
  • 22a8f63 (controller) - deps: bump django from 3.2.11 to 3.2.12 in /rootfs
  • +
  • 3cc3b00 (controller) - dockerfile: use drycc/base image
  • +
  • ee274f6 (controller) - controller: set venv profile
  • +
  • ce6b069 (controller) - controller: set gid uid to 1001
  • +
  • 3a105d3 (controller) - dockerfile: use uid gid
  • +
  • 15f9b0e (controller) - controller: code review
  • +
  • 01e6fd9 (controller) - controller: use passport user id
  • +
  • 893ee31 (controller) - oauth2: update user info pipline
  • +
  • 3028fb4 (controller) - user: set AnonymousUser username
  • +
  • 5daf82d (controller) - controller: set worker_cancel_long_running_tasks_on_connection_loss
  • +
  • 61f2c53 (controller) - controller: change nodes to pod affinity
  • +
  • 88feb1d (controller) - imagebuilder: python=3.10.4 rabbitmq=3.9.14
  • +
  • 914e03f (controller) - controller: use registry.drycc.cc replace docker.io
  • +
  • a5bb548 (controller) - controller: change python-dev registry
  • +
  • 3ecdd7c (controller) - controller: add a separate rabbitmqUrl configuration
  • +
  • 967cb11 (controller) - controller: remove APP_STORAGE
  • +
  • 473d2b5 (controller) - controller: use env replace creds volume
  • +
  • e410d4c (controller) - deps: bump django from 3.2.12 to 3.2.13 in /rootfs
  • +
  • c6ef777 (controller) - controller: simplified passport config
  • +
  • 0fd3233 (controller) - controller: remove settings hardcode
  • +
  • a64e99c (controller) - controller: change passport config
  • +
  • 62aba25 (controller) - controller: set cronjob timezone to utc
  • +
  • 760b70b (controller) - controller: change default ratio
  • +
  • 8dffc3a (controller) - controller: fine management affinity
  • +
  • 26043c4 (controller) - controller: change default app storage
  • +
  • 608bd8d (controller) - deps: bump django from 3.2.13 to 3.2.14 in /rootfs
  • +
  • 18ed0c2 (controller) - controller: remove conjob affinity
  • +
  • add6712 (controller) - controller: add volume expand support use patch
  • +
  • cc1ad13 (controller) - controller: add startupProbe
  • +
  • 0e9a603 (controller) - controller: add clearsocial cronjob
  • +
  • eb6f05d (controller) - controller: change initContainers
  • +
  • 762c676 (controller) - controller: change replicas
  • +
  • abd7e8c (controller) - deps: bump django from 3.2.14 to 3.2.15 in /rootfs
  • +
  • 07fdf1b (controller) - controller: remove database conn_max_age
  • +
  • ef8e41f (controller) - controller: add database replica check
  • +
  • 79143f2 (controller) - controller: upgrade new require
  • +
  • a624048 (controller) - controller: add app.refresh func annotation
  • +
  • b22d367 (controller) - controller: optimize app refresh timing
  • +
  • fe98f0c (database) - database: use exec runner replace docker runner
  • +
  • 5e00c11 (database) - database: canonical charts naming
  • +
  • d2cb860 (database) - database: disable huge_pages
  • +
  • 197d80d (database) - database: add persistence
  • +
  • 1c3e645 (database) - database: provide any additional service annotations
  • +
  • 37730ab (database) - dockerfile: use drycc/base image
  • +
  • 5014112 (database) - dockerfile: change entrypoint
  • +
  • 29b538e (database) - database: change nodes to pod affinity
  • +
  • c2bb074 (database) - database: bump python 3.10.4 and mc 2022.04.01.23.44.48
  • +
  • 077a4e9 (database) - database: use registry.drycc.cc replace docker.io
  • +
  • 560bdb9 (database) - database: change python-dev registry
  • +
  • 1e54b55 (database) - database: https://github.com/minio/minio/issues/14331
  • +
  • d646672 (database) - database: https://github.com/minio/minio/issues/13799
  • +
  • a6ac4e3 (database) - database: use env replace creds volume
  • +
  • 9618d87 (database) - database: fine management affinity
  • +
  • b823273 (database) - database: change minio to storage
  • +
  • 7bd5a90 (database) - database: add check storage health
  • +
  • 20c6d96 (database) - database: fix storage run error
  • +
  • 8bde830 (database) - database: upgrade to pg 14.5
  • +
  • a33b5e5 (fluentd) - fluentd: update plugins
  • +
  • eed7a78 (fluentd) - fluentd: update filter kubernetes setting
  • +
  • cc83dd8 (fluentd) - fluentd: update elasticsearch store setting and support exclude specific container logs
  • +
  • ba2feb2 (fluentd) - fluentd: use exec runner replace docker runner
  • +
  • d528676 (fluentd) - fluentd: simplify drone configuration
  • +
  • dece82d (fluentd) - fluentd: canonical charts naming
  • +
  • 4e0a802 (fluentd) - fluend: replace nsqd with redis
  • +
  • 15ceca0 (fluentd) - dockerfile: use drycc/base image
  • +
  • a7f619f (fluentd) - dockerfile: change workdir
  • +
  • 9adf5ed (fluentd) - database: bump fluentd 1.14.6
  • +
  • 50c14c2 (fluentd) - fluentd: use registry.drycc.cc replace docker.io
  • +
  • 83171b1 (fluentd) - fluentd: change python-dev registry
  • +
  • ec83581 (fluentd) - fluentd: unified reids declaration
  • +
  • 07c63e2 (fluentd) - fluentd: upgrade fluentd 1.15.2
  • +
  • 65df9be (imagebuilder) - imagebuilder: update pack version
  • +
  • 66cab35 (imagebuilder) - imagebuilder: use dind replace go-dev
  • +
  • 0c82060 (imagebuilder) - imagebuilder: use exec runner replace docker runner
  • +
  • 8146da9 (imagebuilder) - imagebuilder: canonical charts naming
  • +
  • 7d97241 (imagebuilder) - dockerfile: use drycc/base image
  • +
  • 07e805c (imagebuilder) - imagebuilder: change default buildpack
  • +
  • 8d1038d (imagebuilder) - imagebuilder: upgrade podman to 4.0.1
  • +
  • 62d3687 (imagebuilder) - imagebuilder: change workdir to /workspace
  • +
  • da8bfb0 (imagebuilder) - imagebuilder: change uid gid to 1001
  • +
  • d44e3bc (imagebuilder) - imagebuilder: upgrade stack
  • +
  • 5b0c7e6 (imagebuilder) - imagebuilder: use registry.drycc.cc replace docker.io
  • +
  • f74cbf6 (imagebuilder) - imagebuilder: add defaultBuildpacksURL
  • +
  • 941d493 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/14331
  • +
  • 449be91 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/13799
  • +
  • 63b0523 (imagebuilder) - imagebuilder: use env replace creds volume
  • +
  • 4e8a6e5 (imagebuilder) - imagebuilder: add imagebuilder config
  • +
  • 2d891f5 (imagebuilder) - imagebuilder: change minio to storage
  • +
  • addceda (imagebuilder) - imagebuilder: upgrade new require
  • +
  • a6e569f (imagebuilder) - imagebuilder: pack_build add –env-file parameter
  • +
  • 6191ff5 (influxdb) - influxdb: use exec runner replace docker runner
  • +
  • dc3f8c7 (influxdb) - influxdb: canonical charts naming
  • +
  • 6b5c819 (influxdb) - influxdb: new ingress style
  • +
  • 68b381d (influxdb) - influxdb: provide any additional service annotations
  • +
  • ea20eb8 (influxdb) - dockerfile: use drycc/base image
  • +
  • 64c0a71 (influxdb) - influxdb: set gid uid to 1001
  • +
  • a709ca1 (influxdb) - influxdb: use DRYCC_UID DRYCC_GID env
  • +
  • 740dff0 (influxdb) - influxdb: use common affinity template
  • +
  • e035673 (influxdb) - influxdb: change nodes to pod affinity
  • +
  • f1cefbd (influxdb) - influxdb: use registry.drycc.cc replace docker.io
  • +
  • a00100e (influxdb) - influxdb: fine management affinity
  • +
  • 9d165ef (influxdb) - influxdb: add probe
  • +
  • bee7fff (influxdb) - influxdb: upgrade to influxdb 2.4.0
  • +
  • 254914c (logger) - logger: use exec runner replace docker runner
  • +
  • 8d91c68 (logger) - logger: canonical charts naming
  • +
  • b6d2182 (logger) - logger: provide any additional service annotations
  • +
  • c35e59a (logger) - dockerfile: use drycc/base image
  • +
  • a63c070 (logger) - logger: change workdir to /workspace
  • +
  • a594b28 (logger) - logger: set gid uid to 1001
  • +
  • 9a90e22 (logger) - dockerfile: use uid gid
  • +
  • 36493b4 (logger) - logger: use common affinity template
  • +
  • 897a3a5 (logger) - logger: change nodes to pod affinity
  • +
  • 03b32ab (logger) - logger: use registry.drycc.cc replace docker.io
  • +
  • a50ba5f (logger) - logger: change python-dev registry
  • +
  • 23187a3 (logger) - logger: unified reids declaration
  • +
  • aaa129a (logger) - logger: fine management affinity
  • +
  • be4f656 (logger) - logger: add replicas
  • +
  • 7c25459 (logger) - charts: add NetworkPolicy
  • +
  • 6810149 (logger) - logger: remove memory storage
  • +
  • a918c50 (logger) - logger: add .vscode to .gitignore
  • +
  • a415210 (logger) - logger: add log follow support
  • +
  • 59b1da3 (logger) - logger: upgrade new require
  • +
  • 27cc151 (monitor) - monitor: use exec runner replace docker runner
  • +
  • 07d6a9d (monitor) - monitor: canonical charts naming
  • +
  • 1054357 (monitor) - monitor: use redis default port
  • +
  • e3673df (monitor) - monitor: remove nsqd
  • +
  • fc9dd3e (monitor) - monitor: new ingress style
  • +
  • 856a898 (monitor) - monitor: add default user env
  • +
  • 9857535 (monitor) - monitor: add random user
  • +
  • 38b5a04 (monitor) - grafana: oauth auto login
  • +
  • 5dfc579 (monitor) - monitor: upgrade version
  • +
  • e121b5a (monitor) - monitor: provide any additional service annotations
  • +
  • 84462a0 (monitor) - dockerfile: use drycc/base image
  • +
  • b9e8ce8 (monitor) - monitor: chore(imagebuilder): change uid gid to 1001
  • +
  • 05ee8ab (monitor) - dockerfile: use uid gid
  • +
  • e1fa68e (monitor) - monitor: use common affinity template
  • +
  • b8f302b (monitor) - monitor: change nodes to pod affinity
  • +
  • 4fc991f (monitor) - database: bump telegraf 1.22.0 and grafana 8.4.5
  • +
  • 21a2f6a (monitor) - monitor: use registry.drycc.cc replace docker.io
  • +
  • acc976f (monitor) - monitor: change python-dev registry
  • +
  • 62d76c1 (monitor) - monitor: unified reids declaration
  • +
  • b3c57ad (monitor) - monitor: optimize oauth2 configuration
  • +
  • 70af6b0 (monitor) - monitor: change passport config
  • +
  • 69f9a88 (monitor) - monitor: fine management affinity
  • +
  • 2fb278f (monitor) - monitor: rename influxdb port
  • +
  • 17548ff (monitor) - grafana: update dashborad
  • +
  • 69d7bbd (monitor) - grafana: influx dashborad disk size
  • +
  • 75db1b0 (monitor) - monitor: upgrade new grafana/telegraf
  • +
  • 80504a1 (monitor) - grafana: update influx and redis dashboard
  • +
  • f7078cb (monitor) - monitor:chown use env
  • +
  • 91ae0dd (passport) - passport: optimize login display
  • +
  • 2d3bbbc (passport) - passport: change drycc logo
  • +
  • 59790a7 (passport) - passport: make user email unique
  • +
  • faea034 (passport) - passport: use strtobool
  • +
  • 1fbf2bc (passport) - passport: use yarn replace npm
  • +
  • 119cac8 (passport) - passport: use exec runner replace docker runner
  • +
  • cff5062 (passport) - passport: set default CSRF_COOKIE_SECURE false
  • +
  • 9cc0210 (passport) - passport: canonical charts naming
  • +
  • 9ab3896 (passport) - passport: new ingress style
  • +
  • 259ccc9 (passport) - passport: provide any additional service annotations
  • +
  • af1bbcd (passport) - dockerfile: use drycc/base image
  • +
  • 9ae5373 (passport) - passport: set venv profile
  • +
  • 8f61090 (passport) - dockerfile: use uid gid
  • +
  • fcaf72d (passport) - passport: upgrade npm package
  • +
  • 546dcd5 (passport) - passport: add license
  • +
  • 4bda2d6 (passport) - passport: use minify
  • +
  • 73b0fd1 (passport) - passport: use common affinity template
  • +
  • 278fe7a (passport) - passport: change nodes to pod affinity
  • +
  • 3cd93d3 (passport) - passport: add reactive
  • +
  • 370b493 (passport) - passport: add footer
  • +
  • 483cbd6 (passport) - passport: use h_captcha replace re_captcha
  • +
  • 3d1675e (passport) - database: bump python 3.10.4 and node 16.14.2
  • +
  • 86a7835 (passport) - passport: use registry.drycc.cc replace docker.io
  • +
  • 2d65355 (passport) - passport: change python-dev registry
  • +
  • 90c1444 (passport) - passport: unified reids declaration
  • +
  • 2e0e417 (passport) - passport: fix firefox footer
  • +
  • ad274be (passport) - passport: use bulecss
  • +
  • f986d8b (passport) - passport: add main footer
  • +
  • 3e52867 (passport) - passport: dynamic settings for vue
  • +
  • 38adabc (passport) - passport: change passport config
  • +
  • f8d6b60 (passport) - passport: fine management affinity
  • +
  • 2cbd79d (passport) - passport: remove database conn_max_age
  • +
  • 7122797 (passport) - passport: change drycc.cc to www.drycc.cc
  • +
  • 8cc84cd (rabbitmq) - rabbitmq: use exec runner replace docker runner
  • +
  • f35930f (rabbitmq) - rabbitmq: add rabbitmq cluster support
  • +
  • fbfa3ba (rabbitmq) - rabbitmq: canonical charts naming
  • +
  • ca60701 (rabbitmq) - rabbitmq: use volumeClaimTemplates
  • +
  • fe5d1b4 (rabbitmq) - rabbitmq: add sharding support
  • +
  • 9c4ab97 (rabbitmq) - rabbitmq: provide any additional service annotations
  • +
  • 348a88a (rabbitmq) - dockerfile: use drycc/base image
  • +
  • 2388be1 (rabbitmq) - rabbitmq: upgrade erlang to 24.2.2
  • +
  • db2eaa5 (rabbitmq) - dockerfile: use uid gid
  • +
  • 772afd1 (rabbitmq) - rabbitmq: change to wait pid file
  • +
  • 2bfc25e (rabbitmq) - rabbitmq: use common affinity template
  • +
  • 11d505e (rabbitmq) - rabbitmq: change nodes to pod affinity
  • +
  • 69d63f1 (rabbitmq) - database: bump erlang 24.3.3 and rabbitmq 3.9.14
  • +
  • 8380299 (rabbitmq) - rabbitmq: use registry.drycc.cc replace docker.io
  • +
  • b3f69f1 (rabbitmq) - rabbitmq: add check rabbitmqLocaltion
  • +
  • 5327c76 (rabbitmq) - rabbitmq: fine management affinity
  • +
  • 5c66b5a (rabbitmq) - rabbitmq: change probe
  • +
  • 27bebf9 (rabbitmq) - rabbitmq: add start-rabbitmq script
  • +
  • 86ee6a7 (rabbitmq) - rabbitmq: upgrade to rabbitmq 3.10.7
  • +
  • 1f29683 (redis) - redis: use exec runner replace docker runner
  • +
  • a5041fc (redis) - redis: canonical charts naming
  • +
  • 64468c2 (redis) - redis: add redis persistence
  • +
  • de5d753 (redis) - redis: provide any additional service annotations
  • +
  • f644639 (redis) - dockerfile: use drycc/base image
  • +
  • 98051d2 (redis) - redis: premission denied
  • +
  • bcb548e (redis) - dockerfile: use uid gid
  • +
  • 524aa41 (redis) - redis: use common affinity template
  • +
  • 26c9466 (redis) - redis: change nodes to pod affinity
  • +
  • b67d7a2 (redis) - redis: use registry.drycc.cc replace docker.io
  • +
  • 839ec50 (redis) - redis: use env replace creds volume
  • +
  • 237ca86 (redis) - redis: fine management affinity
  • +
  • bdd968d (redis) - redis: upgrade neew require
  • +
  • 8b2910f (registry) - registry: use exec runner replace docker runner
  • +
  • eedbe78 (registry) - registry: canonical charts naming
  • +
  • 0241615 (registry) - registry: provide any additional service annotations
  • +
  • 9b58da4 (registry) - dockerfile: use drycc/base image
  • +
  • ab6acb7 (registry) - registry: change workdir to /workspace
  • +
  • f368bf7 (registry) - registry: use DRYCC_UID DRYCC_GID env
  • +
  • f4b9041 (registry) - registry: use common affinity template
  • +
  • c2e87ca (registry) - registry: change nodes to pod affinity
  • +
  • feb6aba (registry) - database: bump mc 2022.04.01.23.44.48
  • +
  • 956932b (registry) - rregistry: use registry.drycc.cc replace docker.io
  • +
  • deda8d8 (registry) - registry: move registry-secret.yaml from workflow to registry
  • +
  • f52c7bf (registry) - registry: change python-dev registry
  • +
  • 007fe03 (registry) - registry: https://github.com/minio/minio/issues/14331
  • +
  • d620c6d (registry) - registry: https://github.com/minio/minio/issues/13799
  • +
  • 85e6b73 (registry) - registry: use env replace creds volume
  • +
  • 6a1155d (registry) - registry: fine management affinity
  • +
  • 7b8ebae (registry) - registry: change minio to storage
  • +
  • 1338951 (registry) - registry: add check storage health
  • +
  • 2fa769d (registry) - registry: change probe
  • +
  • f187cbf (registry) - registry: add replicas
  • +
  • 09d8a7b (registry) - registry: upgrade to mc 2022.08.28.20.08.11
  • +
  • 4b187b8 (registry-proxy) - registry-proxy: use exec runner replace docker runner
  • +
  • 29ffbbe (registry-proxy) - registry-proxy: canonical charts naming
  • +
  • 6d783ba (registry-proxy) - registry-proxy: remove use_cni
  • +
  • 8cf05cf (registry-proxy) - dockerfile: use drycc/base image
  • +
  • 090e286 (registry-proxy) - registry-proxy: chore(imagebuilder): change uid gid to 1001
  • +
  • 7cf6120 (registry-proxy) - registry-proxy: use DRYCC_UID DRYCC_GID env
  • +
  • 3a00697 (registry-proxy) - registry-proxy: use registry.drycc.cc replace docker.io
  • +
  • 30e69e8 (registry-proxy) - registry-proxy: add registry basic auth proxy
  • +
  • 942abce (registry-proxy) - registry-proxy: upgrade to nginx 1.23.1
  • +
  • 5ea3297 (storage) - minio: use exec runner replace docker runner
  • +
  • 8306add (storage) - minio: canonical charts naming
  • +
  • c917e9f (storage) - minio: provide any additional service annotations
  • +
  • 042c732 (storage) - dockerfile: use drycc/base image
  • +
  • 7b47b82 (storage) - minio: change workdir to /workspace
  • +
  • 6f3531e (storage) - minio: use DRYCC_UID DRYCC_GID env
  • +
  • 9795fb1 (storage) - minio: use common affinity template
  • +
  • a7b09c5 (storage) - minio: change nodes to pod affinity
  • +
  • 7607342 (storage) - database: bump mc 2022.04.01.23.44.48 and minio 2022.04.01.03.41.39
  • +
  • ea2b2f1 (storage) - minio: use registry.drycc.cc replace docker.io
  • +
  • 445b501 (storage) - minio: https://github.com/minio/minio/issues/14331
  • +
  • f19fbc7 (storage) - minio: use env replace creds volume
  • +
  • 8982e2e (storage) - minio: use minio to distributed
  • +
  • 06bec73 (storage) - minio: fine management affinity
  • +
  • 9b8f006 (storage) - storage: remove assert
  • +
  • 59d64b9 (storage) - storage: change listen to POD_IP
  • +
  • 60044ee (storage) - storage: add juicefs mount options
  • +
  • 189f944 (storage) - storage: remove volumeName
  • +
  • 302fe89 (storage) - storage: mv to minio dir
  • +
  • 6ec586d (storage) - storage: change readinessProbee andlivenessProbe
  • +
  • 0e028df (storage) - storage: add minio pdb
  • +
  • cf9bd2d (storage) - storage: add check storage health svc
  • +
  • 2dd5c9f (storage) - storage: add volumeBindingMode
  • +
  • fa2effc (storage) - storage: remove databaseBucket
  • +
  • d166cc7 (storage) - charts: format network-policy name
  • +
  • d06bcce (storage) - storage: upgrade to golang 1.19
  • +
  • c2ca05c (storage) - storage: upgrade new require
  • +
+ + + + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/2023/12/08/drycc-workflow-v1.7.0/index.html b/blog/2023/12/08/drycc-workflow-v1.7.0/index.html new file mode 100644 index 000000000..90be4499c --- /dev/null +++ b/blog/2023/12/08/drycc-workflow-v1.7.0/index.html @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow v1.7.0 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+

Drycc Workflow v1.7.0

+
New Drycc Workflow Release v1.7.0
+ + +

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.

+

Workflow ## v1.6.0 -> v1.7.0

+

Releases

+
    +
  • builder v1.4.0 -> v1.5.0
  • +
  • controller v1.5.1 -> v1.6.0
  • +
  • database v1.2.0 -> v1.2.1
  • +
  • passport v1.1.0 -> v1.2.0
  • +
  • imagebuilder v1.1.0 -> v1.1.1
  • +
  • fluentbit v0.0.0 -> v0.0.1
  • +
  • logger v1.3.0 -> v1.3.1
  • +
  • storage v0.0.0 -> v0.0.1
  • +
  • gateway v0.0.0 -> v0.0.1
  • +
  • monitor v1.3.0 -> v1.4.0
  • +
  • redis v1.3.0 -> v1.3.1
  • +
  • timeseries v0.0.0 -> v0.0.1
  • +
  • prometheus v0.0.0 -> v0.1.0
  • +
  • rabbitmq v1.1.0 -> v1.2.0
  • +
  • registry v1.2.0 -> v1.2.1
  • +
  • registry-proxy v1.2.0 -> v1.2.1
  • +
+

Features

+
    +
  • fcbebda (builder) - builder: use TCPRoute expose service
  • +
  • d02bb5d (controller) - controller: support app dns policy config
  • +
  • 9aa968e (controller) - controller: add svc type support
  • +
  • 62e2d34 (controller) - controller: improve the services api
  • +
  • 4393755 (controller) - controller: use gateway replace ingress
  • +
  • 323045d (controller) - controller: add canary support
  • +
  • 3f81c97 (controller) - gateways: add addresses field
  • +
  • 4e64aa7 (controller) - gateways: add addresses field
  • +
  • 02ad581 (monitor) - grafana: add pd tikv dashboard
  • +
  • 2a9e2b0 (monitor) - monitor: add storage monitor
  • +
  • 41d5057 (monitor) - grafana: data source change to prometheus
  • +
  • ec035d1 (monitor) - monitor: usegateway replace ingress
  • +
  • c694c98 (monitor) - grafana: add drycc storage seaweedfs dashboard
  • +
  • 1e1fdc8 (passport) - passport: use gateway replace ingress
  • +
  • ffdb408 (prometheus) - prometheus: use gateway replace ingress
  • +
  • 04152b9 (rabbitmq) - rabbitmq: use gateway replace ingress
  • +
+

Fixes

+
    +
  • 0499500 (builder) - builder: manifest error
  • +
  • 642491d (builder) - builder: no build log
  • +
  • 873d146 (controller) - controller: do not set entrypoint when no procfile
  • +
  • d9028c5 (controller) - controller: pip8 error
  • +
  • 3efcfb7 (controller) - controller: manifest error
  • +
  • 18a3a1a (controller) - controller: miss service error
  • +
  • 94f796c (controller) - controller: drycc run pod should not restart
  • +
  • 80f3161 (controller) - controller: monitor query error
  • +
  • b76f2c5 (controller) - controller: read websocket delay
  • +
  • b6e068e (controller) - controller: metrics sql tpl, gateway pod should not restart, cleanup old rs, update monitor datatbase config
  • +
  • ad9adc6 (controller) - controller: rabbitmq sharding err
  • +
  • 6773907 (controller) - controller: default k8s pod annotaions
  • +
  • ffcf1f9 (controller) - controller: under-indented for visual indent
  • +
  • 3afd0cf (controller) - controller: charts env error
  • +
  • 769bb8b (database) - database: manifest error
  • +
  • 769bb8b (database) - database: label conflict error
  • +
  • 6a321c5 (database) - database: link error
  • +
  • 558feae (fluentbit) - fluentbit: build charts error
  • +
  • 98d8a2a (gateway) - fixup
  • +
  • 8b5dde1 (gateway) - gateway: secretName
  • +
  • 702866d (gateway) - gateway: build status
  • +
  • f55dac1 (imagebuilder) - imagebuilder: manifest error
  • +
  • ac13b5f (imagebuilder) - imagebuilder: build svg
  • +
  • 6b7bbc5 (logger) - logger: manifest error
  • +
  • 0136b5c (monitor) - monitor: manifest error
  • +
  • f03d975 (passport) - passport: DRYCC_GRAFANA_DOMAIN error
  • +
  • b530ea8 (passport) - passport: manifest error
  • +
  • be5a0a7 (passport) - passport: change passport
  • +
  • 1596c7f (rabbitmq) - rabbitmq: manifest error
  • +
  • 0dc4f6f (rabbitmq) - rabbitmq: images-shard error
  • +
  • 43293ae (redis) - redis: manifest error
  • +
  • ca13b7d (registry) - registry: manifest error
  • +
  • ab5c793 (registry) - registry: garbage collect error
  • +
  • ab0fabc (registry-proxy) - registry-proxy: manifest error
  • +
  • dfc7236 (registry-proxy) - registry-proxy: daemon yaml format
  • +
  • 42c03be (storage) - storage: seaweedfs csi error
  • +
  • 453e41a (timeseries) - timeseries: could not register node
  • +
+

Docs

+
    +
  • 5433c89 (gateway) - gateway: add prerequisites
  • +
  • 2f0c5d8 (logger) - logger: change architecture
  • +
+

Maintenance

+
    +
  • bdd02eb (builder) - builder: use dynamic clusterrole name
  • +
  • 66b4b25 (builder) - builder: upgrade new controller-go-sdk
  • +
  • 219d86f (builder) - builder: upgrade go.mod
  • +
  • 91f2f14 (builder) - builder: use woodpecker replace drone
  • +
  • 9abca16 (builder) - woodpecker: use woodpecker ci build status
  • +
  • f43dd50 (builder) - deps: bump golang.org/x/net from 0.2.0 to 0.7.0
  • +
  • 0384c69 (builder) - builder: add chart appVersion
  • +
  • e3149b9 (builder) - builder: upgrade codename to bookworm
  • +
  • d88ea1b (builder) - builder: add codename build-arg
  • +
  • ba59030 (builder) - builder: upgrade go.mod
  • +
  • 1114dd7 (builder) - builder: bump common 1.1.2
  • +
  • fe50b62 (builder) - builder: change drycc gateway listener name
  • +
  • db3950c (builder) - builder: remove gateway route
  • +
  • 5a508bb (builder) - builder: use podman replace docker
  • +
  • bbb9029 (builder) - deps: bump golang.org/x/net from 0.12.0 to 0.17.0
  • +
  • f4e5d6c (builder) - builder: remove health url
  • +
  • 9111c8f (builder) - builder: remove io/ioutil
  • +
  • 1f36e3d (controller) - deps: bump django from 4.1.2 to 4.1.6 in /rootfs
  • +
  • e4ab434 (controller) - controller: use woodpecker replace drone
  • +
  • 9f0301e (controller) - deps: bump django from 4.1.6 to 4.1.7 in /rootfs
  • +
  • 3932423 (controller) - woodpecker: use woodpecker ci build status
  • +
  • ae8b6b4 (controller) - setting: support KUBERNETES_LIMITS env config
  • +
  • c10b9bc (controller) - controller: using the api_version instead of hard coding
  • +
  • e6908cd (controller) - controller: upgrade requirements
  • +
  • b0eba0c (controller) - controller: add route rules serializer
  • +
  • 2e4b6a4 (controller) - controller: add chart appVersion
  • +
  • 7d32b55 (controller) - controller: upgrade to bookworm
  • +
  • f2dc8dd (controller) - controller: add codename build-arg
  • +
  • 5739b83 (controller) - controller: use timescaledb replace influxdb
  • +
  • 53892cb (controller) - controller: add timeseries
  • +
  • 0fe0eae (controller) - controller: upgrade requirements
  • +
  • 18b2a91 (controller) - deps: bump aiohttp from 3.8.4 to 3.8.5 in /rootfs
  • +
  • f50874a (controller) - controller: bump common 1.1.2
  • +
  • 956cd08 (controller) - controller: change drycc gateway listener name
  • +
  • 9ab3ead (controller) - controller: remove passport url check
  • +
  • a24c7b0 (controller) - controller: remove gateway route
  • +
  • f7e539a (controller) - controller: change celery priority
  • +
  • ab77a52 (controller) - controller: use podman replace docker
  • +
  • 8e27501 (controller) - controller: dynamic app storage class
  • +
  • 385978b (controller) - controller: list_pods datetime format
  • +
  • b20362c (controller) - deps: bump django from 4.2.3 to 4.2.7 in /rootfs
  • +
  • e11ae1b (controller) - controller: add cluster migrate
  • +
  • ca6e9df (controller) - controller: async mount
  • +
  • 9a7fbfc (controller) - controller: remove FOSSA
  • +
  • 3d55279 (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs
  • +
  • d498a11 (controller) - controller: add measure loalancers
  • +
  • 249a985 (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs
  • +
  • b967f58 (controller) - deps: bump aiohttp from 3.8.6 to 3.9.0 in /rootfs (#107)
  • +
  • 8ca9ed6 (controller) - controller: no longer restrict reserved domain
  • +
  • 9ff6649 (database) - database: add init database configure
  • +
  • 9b4cd26 (database) - database: use dynamic clusterrole name
  • +
  • b59cde4 (database) - database: remove minio require
  • +
  • 86462f8 (database) - database: use woodpecker replace drone
  • +
  • 1e8555a (database) - database: add chart appVersion
  • +
  • 1b762d5 (database) - database: upgrade codename to bookworm
  • +
  • 9ffe1fd (database) - database: add codename build-arg
  • +
  • 69466d7 (database) - database: add database extension
  • +
  • beb4b62 (database) - database: bump common 1.1.2
  • +
  • 67e2714 (database) - database: use podman replace docker
  • +
  • 8f328f8 (fluentbit) - fluentbit: no limit buffer size for kube api
  • +
  • fc0552c (fluentbit) - fluentbit: use podman replace docker
  • +
  • 63a6cab (fluentbit) - fluentbit: change fluentbit match
  • +
  • 220f81a (fluentbit) - fluentbit: run as no-root
  • +
  • aec1393 (fluentbit) - fluentbit: change configmap name
  • +
  • 1af4fd2 (fluentbit) - fluentbit: change default stream name
  • +
  • bef90ad (gateway) - gateway: add route for gateway
  • +
  • d523ddb (gateway) - gateway: change drycc gateway listener name
  • +
  • d9137f4 (gateway) - gateway: add chart appVersion
  • +
  • 0425dd4 (gateway) - gateway: add customListeners
  • +
  • 3982b86 (imagebuilder) - imagebuilder: use woodpecker replace drone
  • +
  • 3e4e7a3 (imagebuilder) - imagebuilder: add chart appVersion
  • +
  • 8df6e8e (imagebuilder) - imagebuilder: upgrade stack version
  • +
  • a5601f7 (imagebuilder) - imagebuilder: add drycc_app env
  • +
  • 07465f8 (imagebuilder) - imagebuilder: upgrade to bookworm
  • +
  • 00d22d2 (imagebuilder) - imagebuilder: add codename build-arg
  • +
  • 0b7a24e (imagebuilder) - imagebuilder: upgrade podman/mc/caddy
  • +
  • a7d8be8 (imagebuilder) - imagebuilder: use podman replace docker
  • +
  • 6b2da83 (logger) - logger: use woodpecker replace drone
  • +
  • 8245b25 (logger) - woodpecker: use woodpecker ci build status
  • +
  • f811a74 (logger) - logger: add chart appVersion
  • +
  • 413f6f6 (logger) - logger: upgrade codename to bookworm
  • +
  • 2ac6b10 (logger) - logger: add codename build-arg
  • +
  • 2581426 (logger) - logger: bump redis to v9
  • +
  • 364b25a (logger) - logger: bump common 1.1.2
  • +
  • dc169a3 (logger) - logger: use fluentbit replace fluentd
  • +
  • d855d91 (logger) - logger: use podman replace docker
  • +
  • f767235 (monitor) - monitor: add off-cluster passport configure
  • +
  • ab23936 (monitor) - monitor: use dynamic clusterrole name
  • +
  • 47beee0 (monitor) - monitor: change tikv secret key
  • +
  • af7703f (monitor) - grafana: remove panel when component off-cluster
  • +
  • 1b870c2 (monitor) - monitor: use woodpecker replace drone
  • +
  • 4a5f1f1 (monitor) - grafana: up ldap api_url config
  • +
  • 143cabe (monitor) - monitor: add prometheus architecture diagram
  • +
  • 93091c2 (monitor) - woodpecker: use woodpecker ci build status
  • +
  • 0b7045a (monitor) - grafana: add dashboard kubernetes_deployment_metrics
  • +
  • 2fb1839 (monitor) - woodpecker: pipeline config VERSION, when build container image
  • +
  • e272416 (monitor) - monitor: add chart appVersion
  • +
  • abc0e53 (monitor) - monitor: upgrade codename to bookworm
  • +
  • 86cc01b (monitor) - monitor: add codename build-arg
  • +
  • 1cd849f (monitor) - monitor: add postgresql outputs
  • +
  • c3205c0 (monitor) - monitor: change default agent config
  • +
  • 8c802c0 (monitor) - monitor: add timeseries database
  • +
  • e9abc40 (monitor) - monitor: bump common 1.1.2
  • +
  • 6af66cd (monitor) - monitor: change drycc gateway listener name
  • +
  • d02d718 (monitor) - monitor: remove gateway route
  • +
  • 3509c29 (monitor) - monitor: use podman replace docker
  • +
  • ed7bfa2 (monitor) - monitor: optimize env PROMETHEUS_URL
  • +
  • da89bef (passport) - passport: charts codereview
  • +
  • 61c4a96 (passport) - passport: support init app config
  • +
  • 9101006 (passport) - passport: add initApplications to charts
  • +
  • 7dd7fa4 (passport) - passport: use woodpecker replace drone
  • +
  • 4400199 (passport) - woodpecker: use woodpecker ci build status
  • +
  • 6b2c546 (passport) - passport: change secret name to drycc-passport-auto-tls
  • +
  • c8bd824 (passport) - passport: upgrade requirements
  • +
  • aee5aef (passport) - passport: add chart appVersion
  • +
  • 2d81953 (passport) - passport: upgrade codename to bookworm
  • +
  • 9e66242 (passport) - passport: add codename build-arg
  • +
  • 0fca998 (passport) - passport: upgrade requirements
  • +
  • 3482528 (passport) - passport: bump common 1.1.2
  • +
  • 0c5ec93 (passport) - passport: change drycc gateway listener name
  • +
  • f7b8f53 (passport) - passport: remove gateway route
  • +
  • baf69da (passport) - passport: use podman replace docker
  • +
  • fcd45dd (passport) - passport: add cluster migrate
  • +
  • da6d32a (prometheus) - prometheus: add prometheus-config
  • +
  • 683de9e (prometheus) - prometheus: use podman replace docker
  • +
  • 3323300 (prometheus) - prometheus: remove gateway route
  • +
  • da1d356 (prometheus) - prometheus: change drycc gateway listener name
  • +
  • 4e7a936 (prometheus) - prometheus: bump common 1.1.2
  • +
  • 44c1c6f (prometheus) - prometheus: add codename build-arg
  • +
  • d1f1dda (prometheus) - prometheus: upgrade codename to bookworm
  • +
  • 0836fc1 (prometheus) - prometheus: add chart appVersion
  • +
  • 9e13232 (prometheus) - prometheus: add LICENSE
  • +
  • f53e14a (rabbitmq) - rabbitmq: remove auto user
  • +
  • 0ec7277 (rabbitmq) - rabbitmq: use woodpecker replace drone
  • +
  • f376a30 (rabbitmq) - woodpecker: use woodpecker ci build status
  • +
  • 51405d8 (rabbitmq) - rabbitmq: add chart appVersion
  • +
  • 463ca03 (rabbitmq) - rabbitmq: upgrade codename to bookworm
  • +
  • 1978a71 (rabbitmq) - rabbitmq: add codename build-arg
  • +
  • 139277f (rabbitmq) - rabbitmq: bump common 1.1.2
  • +
  • be49741 (rabbitmq) - rabbitmq: change drycc gateway listener name
  • +
  • 6d22518 (rabbitmq) - rabbitmq: remove gateway route
  • +
  • 0eb7833 (rabbitmq) - rabbitmq: add check shards
  • +
  • 9211063 (rabbitmq) - rabbitmq: erlang vm tuning optimization
  • +
  • 648a78d (rabbitmq) - rabbitmq: use podman replace docker
  • +
  • 0b43a4d (rabbitmq) - rabbitmq: add x-random exchange
  • +
  • ad1c4da (redis) - redis: use woodpecker replace drone
  • +
  • 3f37f92 (redis) - redis: add chart appVersion
  • +
  • e3bef7a (redis) - redis: upgrade codename to bookworm
  • +
  • 4e806d4 (redis) - redis: add codename build-arg
  • +
  • d5023be (redis) - redis: bump common 1.1.2
  • +
  • 98f5d6f (redis) - redis: use podman replace docker
  • +
  • 063f29e (registry) - registry: use woodpecker replace drone
  • +
  • 17bf8ae (registry) - woodpecker: use woodpecker ci build status
  • +
  • 7bbad15 (registry) - registry: add chart appVersion
  • +
  • 279154f (registry) - registry: upgrade codename to bookworm
  • +
  • 3e4ae84 (registry) - registry: add codename build-arg
  • +
  • fa322d6 (registry) - registry: bump common 1.1.2
  • +
  • 6c18fe0 (registry) - registry: use podman replace docker
  • +
  • 0bc8472 (registry) - registry: remove health url
  • +
  • 5dacd9f (registry) - registry: add wait-for-port check
  • +
  • fdeefc3 (registry) - registry: use headless
  • +
  • 08bf9f8 (registry) - registry: change registry port to 5000
  • +
  • 40bcea2 (registry) - registry: add registry push test
  • +
  • 871b8e7 (registry) - registry: add default env
  • +
  • 7f3b3ac (registry) - registry: bump registry 2.8.3
  • +
  • 569f15d (registry-proxy) - registry-proxy: use woodpecker replace drone
  • +
  • cc33caf (registry-proxy) - woodpecker: use woodpecker ci build status
  • +
  • 0002aab (registry-proxy) - registry-proxy: add chart appVersion
  • +
  • 40af10b (registry-proxy) - registry-proxy: upgrade codename to bookworm
  • +
  • c56b9df (registry-proxy) - registry-proxy: add codename build-arg
  • +
  • 9d5bfe0 (registry-proxy) - registry-proxy: use podman replace docker
  • +
  • e6a3350 (registry-proxy) - registry-proxy: change worker_processes to 1
  • +
  • 726f39d (storage) - storage: add volume compactionMBps
  • +
  • a5aa2d8 (storage) - storage: add threshold to vacuum and reclaim spaces
  • +
  • e687d04 (storage) - storage: delete disk type in single disk case
  • +
  • 75ee2e4 (storage) - storage: change datanode replicas to 4
  • +
  • c5fd7ba (storage) - storage: delete useless env
  • +
  • b3826ea (storage) - storage: add ssd hdd dir
  • +
  • 29881a0 (storage) - storage: add balance cronjob
  • +
  • c5a0f51 (storage) - storage: add defaultReplication for seaweedfs master
  • +
  • 543c7a2 (timeseries) - timeseries: use podman replace docker
  • +
  • 5376024 (timeseries) - timeseries: update timeseries-service-replica
  • +
  • 52e8520 (timeseries) - timeseries: bump common 1.1.2
  • +
  • f82657c (timeseries) - timeseries: add start script
  • +
+ + + + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/2024/01/29/drycc-workflow-v1.7.2/index.html b/blog/2024/01/29/drycc-workflow-v1.7.2/index.html new file mode 100644 index 000000000..26af3f229 --- /dev/null +++ b/blog/2024/01/29/drycc-workflow-v1.7.2/index.html @@ -0,0 +1,319 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow v1.7.2 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+

Drycc Workflow v1.7.2

+
New Drycc Workflow Release v1.7.2
+ + +

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.

+

Workflow ## v1.7.1 -> v1.7.2

+

Releases

+
    +
  • controller v1.6.0 -> v1.6.1
  • +
  • logger v1.3.1 -> v1.3.2
  • +
  • storage v0.0.1 -> v0.0.2
  • +
  • timeseries v0.0.1 -> v0.0.2
  • +
  • prometheus v0.1.0 -> v0.1.1
  • +
  • workflow-cli v1.5.0 -> v1.5.1
  • +
+

Fixes

+
    +
  • 2fe80a6 (controller) - resources: after resources instance update, could not delete (#111)
  • +
  • a4082ad (controller) - controller: resource status and binding
  • +
  • e9bfccc (controller) - controller: fix multiple volumes mount at one dir error (#116)
  • +
  • 58d2b4c (logger) - logger: redis conn error block
  • +
  • 7cb2700 (prometheus) - prometheus: prometheus config basic_auth
  • +
  • 7838c6b (storage) - storage: random accesskey secretkey
  • +
  • d9dcdfb (storage) - storage: pod restart loses data
  • +
  • 3cbdd29 (storage) - storage: tipd cannot start after deleting pod
  • +
  • be7e11f (storage) - storage: jq command not found
  • +
  • 878f674 (storage) - storage: charts updateStrategy error
  • +
  • 06cfe56 (timeseries) - timeseries: the data node ip is incorrect
  • +
+

Maintenance

+
    +
  • 7f29f5a (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 async
  • +
  • dc6f45e (controller) - controller: add channel for pod exec
  • +
  • af4f3a7 (controller) - controller: avoid error when secret no data field (#117)
  • +
  • ca27956 (controller) - controller: add pod default security
  • +
  • b2e9c64 (prometheus) - charts: node-exporter mount root (#2)
  • +
  • 3cdb2b6 (storage) - storage: bump seaweedfs 3.61
  • +
  • 00dd2fd (storage) - storage: add csi daemonset updateStrategy
  • +
  • 48e763c (storage) - storage: add drycc storage upgrade document
  • +
  • 841df90 (storage) - storage: bump seaweedfs 3.62
  • +
  • cefd52e (timeseries) - timeseries: add check data node exists
  • +
  • ad1c46e (workflow-cli) - resources: resources instance add message
  • +
  • 9f955c2 (workflow-cli) - workflow-cli: add short options cpu
  • +
  • 65399ef (workflow-cli) - workflow-cli: add tty resize support
  • +
+ + + + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/2024/02/27/drycc-workflow-v1.7.5/index.html b/blog/2024/02/27/drycc-workflow-v1.7.5/index.html new file mode 100644 index 000000000..55c0553ad --- /dev/null +++ b/blog/2024/02/27/drycc-workflow-v1.7.5/index.html @@ -0,0 +1,316 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow v1.7.5 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+

Drycc Workflow v1.7.5

+
New Drycc Workflow Release v1.7.5
+ + +

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.

+

Workflow ## v1.7.4 -> v1.7.5

+

Releases

+
    +
  • builder v1.5.0 -> v1.5.1
  • +
  • controller v1.6.3 -> v1.7.0
  • +
  • logger v1.3.2 -> v1.3.3
  • +
  • storage v0.0.3 -> v0.0.4
  • +
  • redis v1.3.1 -> v1.3.2
  • +
  • rabbitmq v1.2.0 -> v1.2.1
  • +
  • registry v1.2.1 -> v1.2.2
  • +
  • workflow-cli v1.5.1 -> v1.5.2
  • +
+

Features

+
    +
  • 95d130a (controller) - controller: volume support nfs
  • +
+

Fixes

+
    +
  • ee2ee15 (controller) - controller: container entrypoint error
  • +
  • 03ea4f8 (controller) - controller: class property have been deprecated in python 3.11
  • +
  • 5f04d17 (controller) - controller: miss err msg
  • +
  • 27972a3 (controller) - controller: load_db_state_to_k8s err
  • +
  • a005d62 (controller) - controller: volume repeat path no error
  • +
  • c7a5ba6 (rabbitmq) - rabbitmq: cpu usage to high
  • +
  • 45c2077 (workflow-cli) - workflow-cli: miss err msg
  • +
  • bc738bd (workflow-cli) - workflow-cli: volumes list format
  • +
+

Maintenance

+
    +
  • 35e1c06 (builder) - builder: bump golang 1.22
  • +
  • 26caa36 (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.10
  • +
  • e625c2f (logger) - logger: bump golang 1.22
  • +
  • bfa500d (redis) - redis: headless svc does not require ports
  • +
  • 330209a (registry) - registry: headless svc does not require ports
  • +
  • 48c42eb (storage) - storage: change volume index to leveldb
  • +
  • f4fde9d (storage) - storage: add volume size limit
  • +
  • 33e3684 (workflow-cli) - workflow-cli: volume support nfs
  • +
  • 48d5950 (workflow-cli) - workflow-cli: bump golang 1.22
  • +
+ + + + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/2024/02/27/drycc-workflow-v1.7.6/index.html b/blog/2024/02/27/drycc-workflow-v1.7.6/index.html new file mode 100644 index 000000000..24d6fb2fb --- /dev/null +++ b/blog/2024/02/27/drycc-workflow-v1.7.6/index.html @@ -0,0 +1,284 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow v1.7.6 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+

Drycc Workflow v1.7.6

+
New Drycc Workflow Release v1.7.6
+ + +

Workflow ## v1.7.5 -> v1.7.6

+

Releases

+
    +
  • storage v0.0.4 -> v0.0.5
  • +
+

Maintenance

+
    +
  • 6cb63b6 (storage) - seaweedfs: bump version 3.63
  • +
+ + + + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/2024/04/30/drycc-workflow-v1.7.7/index.html b/blog/2024/04/30/drycc-workflow-v1.7.7/index.html new file mode 100644 index 000000000..eb154c08e --- /dev/null +++ b/blog/2024/04/30/drycc-workflow-v1.7.7/index.html @@ -0,0 +1,436 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow v1.7.7 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+

Drycc Workflow v1.7.7

+
New Drycc Workflow Release v1.7.7
+ + +

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
  • +
  • storage v0.0.5 -> v0.1.0
  • +
  • gateway v0.0.2 -> v0.0.3
  • +
  • monitor v1.4.0 -> v1.4.1
  • +
  • redis v1.3.2 -> v1.4.0
  • +
  • timeseries v0.0.2 -> v0.1.0
  • +
  • prometheus v0.1.1 -> v0.1.2
  • +
  • rabbitmq v1.2.1 -> v1.3.0
  • +
  • registry v1.2.2 -> v1.3.0
  • +
  • registry-proxy v1.2.1 -> v1.2.2
  • +
  • workflow-cli v1.5.2 -> v1.6.0
  • +
+

Features

+
    +
  • 6c1cf5e (builder) - charts: reuses the value from an existing secret and config
  • +
  • 65ae63c (builder) - pipeline: add dryccfile support
  • +
  • bb7b11d (builder) - auth: add tokens api
  • +
  • 39d022f (controller) - ps: add pod logs support
  • +
  • 86056d0 (controller) - charts: reuses the value from an existing secret and config
  • +
  • 4cf005c (controller) - limits: add limits plan support
  • +
  • bf60e4b (controller) - controller: add init job
  • +
  • 98f77a8 (controller) - pipeline: add dryccfile support
  • +
  • 8ce9a83 (controller) - cert-manager: add tls events
  • +
  • 7034f5d (controller) - config: deploy according to procfile_type
  • +
  • 5554d8f (controller) - config: add typed_values
  • +
  • 2c5bbad (controller) - auth: add token api
  • +
  • 410d34e (database) - charts: reuses the value from an existing secret and config
  • +
  • 693e4d1 (imagebuilder) - pipeline: add dryccfile support
  • +
  • 7d9cc06 (imagebuilder) - config: add typed values
  • +
  • 854e171 (passport) - charts: reuses the value from an existing secret and config
  • +
  • 7ac9255 (passport) - oauth2: add authorization code for any grant type
  • +
  • 4517547 (rabbitmq) - charts: reuses the value from an existing secret and config
  • +
  • bccfcb4 (redis) - charts: reuses the value from an existing secret and config
  • +
  • d887605 (registry) - charts: reuses the value from an existing secret and config
  • +
  • ff09e5b (storage) - charts: reuses the value from an existing secret and config
  • +
  • c6e2ac8 (timeseries) - charts: reuses the value from an existing secret and config
  • +
  • 22c4c77 (workflow-cli) - apps: change drycc run to async
  • +
  • a9e6369 (workflow-cli) - ps: add pod logs support
  • +
  • 2bc31c8 (workflow-cli) - limits: add limits plan support
  • +
  • f40398a (workflow-cli) - pipeline: add dryccfile support
  • +
  • 03638ff (workflow-cli) - tls: add tls events
  • +
  • 9113627 (workflow-cli) - config: add typed values
  • +
  • 43ee760 (workflow-cli) - auth: add tokens api
  • +
+

Fixes

+
    +
  • 50dfe64 (builder) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • ab09b24 (controller) - healthcheck: delete outdated code
  • +
  • 52019b5 (controller) - services: default PORT change error
  • +
  • f57ae42 (controller) - certificate: failed to create certificate
  • +
  • 30c3f54 (controller) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • dbba43a (controller) - service: update port error
  • +
  • e0459c5 (controller) - copy: use deepcopy replace copy
  • +
  • 2122479 (controller) - charts: failed to call webhook
  • +
  • 53d9977 (controller) - signals: config limits handle error
  • +
  • afda287 (controller) - limits: always set default
  • +
  • b350cb8 (database) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • b48a422 (fluentbit) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 7cebca2 (gateway) - cert-manager: auto tls error
  • +
  • 190c19b (imagebuilder) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 2c6a6f9 (logger) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 10bb98d (monitor) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • f8225dc (passport) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 06db66c (prometheus) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • f4aff72 (rabbitmq) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 88c18ff (redis) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 5dcc19d (registry) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 092a939 (registry-proxy) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 3597ac9 (storage) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 5a49b35 (timeseries) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 0c4a48a (workflow-cli) - tls: change issuer options
  • +
  • 06a2511 (workflow-cli) - tls: info error
  • +
+

Maintenance

+
    +
  • 2f7617e (builder) - go: bump controller-sdk-go version
  • +
  • aae2f29 (builder) - charts: add diagnostic mode
  • +
  • 7304980 (builder) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 30b648b (builder) - charts: change canary app version
  • +
  • 2afa006 (builder) - controller-sdk-go: bump version
  • +
  • d127a90 (builder) - config: add typed values
  • +
  • 32fdfd0 (controller) - charts: add diagnostic mode
  • +
  • 0974942 (controller) - woodpecker: migrations woodpecker-ci to 2
  • +
  • f401e08 (controller) - python: bump python 3.12
  • +
  • c565959 (controller) - celery: remove retrieve_resource task
  • +
  • 47be1a1 (controller) - requirements: bump drf 3.15.1
  • +
  • 99f7468 (controller) - charts: add config to values.yaml
  • +
  • 7d17f5c (controller) - scale: prohibit scale when there is a running pipeline
  • +
  • f09e1c9 (controller) - resource: sort services and plans
  • +
  • e817505 (controller) - limits: change default cpu and gpu name
  • +
  • 5531b2f (controller) - auth: add password login
  • +
  • 27473f7 (controller) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs
  • +
  • c1ee1c7 (controller) - deps: bump aiohttp from 3.9.3 to 3.9.4 in /rootfs
  • +
  • affbcb5 (database) - postgres: add patroni and postgres params (#15)
  • +
  • f9e4eda (database) - dockerfile: install vi
  • +
  • 008b7b6 (database) - dockerfile: install vim instand of vi
  • +
  • dbbfee1 (database) - charts: add diagnostic mode
  • +
  • 2e26c33 (database) - woodpecker: migrations woodpecker-ci to 2
  • +
  • a1b81f2 (database) - charts: change canary app version
  • +
  • bc725e8 (fluentbit) - charts: add diagnostic mode
  • +
  • 5d73886 (fluentbit) - woodpecker: migrations woodpecker-ci to 2
  • +
  • b85072d (fluentbit) - charts: change canary app version
  • +
  • 761174d (gateway) - gateway: change secrets name
  • +
  • 1c304da (gateway) - woodpecker: migrations woodpecker-ci to 2
  • +
  • b919a4c (gateway) - charts: change canary app version
  • +
  • 3cea298 (imagebuilder) - charts: allow all dns
  • +
  • 653bcbe (imagebuilder) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 59daeab (imagebuilder) - charts: change canary app version
  • +
  • 2834a5a (logger) - charts: add diagnostic mode
  • +
  • 6685492 (logger) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 191cdaf (logger) - charts: change canary app version
  • +
  • b3c3cfa (monitor) - charts: add diagnostic mode
  • +
  • 796799d (monitor) - grafana: add node metrics dashboard
  • +
  • ef2a222 (monitor) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 9c83090 (monitor) - charts: change canary app version
  • +
  • 1a97c2c (passport) - charts: add diagnostic mode
  • +
  • 353e1ae (passport) - logger: add oauth2_provider logger config
  • +
  • fe735c0 (passport) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 41d6144 (passport) - charts: change canary app version
  • +
  • 979d474 (passport) - python: bump python 3.12
  • +
  • e9f41a1 (passport) - requirements: bump drf 3.15.1
  • +
  • f479f4d (passport) - charts: add migrate job
  • +
  • ad9abf6 (passport) - passport: migrations add run_before
  • +
  • 95ac667 (passport) - passport: optimize the use of master and slave database rules
  • +
  • 204f7fc (passport) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs
  • +
  • 90a6410 (prometheus) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 2d8eb44 (prometheus) - charts: change canary app version
  • +
  • 9687a17 (rabbitmq) - charts: add diagnostic mode
  • +
  • 35d3d5b (rabbitmq) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 6a6564d (rabbitmq) - charts: change canary app version
  • +
  • cb6722f (redis) - charts: add diagnostic mode
  • +
  • 9553497 (redis) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 1c8dc07 (redis) - charts: change canary app version
  • +
  • 9fa2a32 (registry) - charts: add diagnostic mode
  • +
  • 9b09e51 (registry) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 7dbd390 (registry) - charts: change canary app version
  • +
  • e1d2a33 (registry-proxy) - charts: add diagnostic mode
  • +
  • 3eabfdd (registry-proxy) - charts: remove default limits
  • +
  • f8754da (registry-proxy) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 7df7316 (registry-proxy) - charts: change canary app version
  • +
  • 861d3b8 (storage) - filer: modify the default parameters of the filer
  • +
  • 5fa08da (storage) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 22c4620 (storage) - charts: change canary app version
  • +
  • 6c1e29c (timeseries) - postgres: add patroni params
  • +
  • e280d3f (timeseries) - dockerfile: install vi
  • +
  • 5213617 (timeseries) - dockerfile: install vim instand of vi
  • +
  • a569a57 (timeseries) - charts: add diagnostic mode
  • +
  • b93ec70 (timeseries) - woodpecker: migrations woodpecker-ci to 2
  • +
  • ff3b870 (timeseries) - charts: change canary app version
  • +
  • e334f74 (workflow-cli) - healthcheck: delete outdated healthcheck style
  • +
  • 4f8b960 (workflow-cli) - auth: add password login
  • +
+ + + + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/2024/05/01/drycc-workflow-v1.7.8/index.html b/blog/2024/05/01/drycc-workflow-v1.7.8/index.html new file mode 100644 index 000000000..133d29caf --- /dev/null +++ b/blog/2024/05/01/drycc-workflow-v1.7.8/index.html @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow v1.7.8 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+

Drycc Workflow v1.7.8

+
New Drycc Workflow Release v1.7.8
+ + +

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 (workflow-cli) - domain: add procfile_type
  • +
+ + + + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/_print/index.html b/blog/_print/index.html new file mode 100644 index 000000000..a92e34b41 --- /dev/null +++ b/blog/_print/index.html @@ -0,0 +1,2411 @@ + + + + + + + + + + + + + + + + + + + + + +Blog | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Blog

+ + + + + + + + +
+

This is the blog section. It has two categories: News and Releases.

+

Files in these directories will be listed in reverse chronological order.

+ +
+
+ + + + + + + + + + + + + + + + + + + +
+

News

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+

Welcome to Drycc

+
Drycc Workflow is A Open, Unified, Lightweight, Simpler Containers as a Service (CaaS).
+ +

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.

+ +
+ + + + + + + + + + + + + + + + + + + + +
+

Release

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.7.8

+
New Drycc Workflow Release v1.7.8
+ +

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 (workflow-cli) - domain: add procfile_type
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.7.7

+
New Drycc Workflow Release v1.7.7
+ +

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
  • +
  • storage v0.0.5 -> v0.1.0
  • +
  • gateway v0.0.2 -> v0.0.3
  • +
  • monitor v1.4.0 -> v1.4.1
  • +
  • redis v1.3.2 -> v1.4.0
  • +
  • timeseries v0.0.2 -> v0.1.0
  • +
  • prometheus v0.1.1 -> v0.1.2
  • +
  • rabbitmq v1.2.1 -> v1.3.0
  • +
  • registry v1.2.2 -> v1.3.0
  • +
  • registry-proxy v1.2.1 -> v1.2.2
  • +
  • workflow-cli v1.5.2 -> v1.6.0
  • +
+

Features

+
    +
  • 6c1cf5e (builder) - charts: reuses the value from an existing secret and config
  • +
  • 65ae63c (builder) - pipeline: add dryccfile support
  • +
  • bb7b11d (builder) - auth: add tokens api
  • +
  • 39d022f (controller) - ps: add pod logs support
  • +
  • 86056d0 (controller) - charts: reuses the value from an existing secret and config
  • +
  • 4cf005c (controller) - limits: add limits plan support
  • +
  • bf60e4b (controller) - controller: add init job
  • +
  • 98f77a8 (controller) - pipeline: add dryccfile support
  • +
  • 8ce9a83 (controller) - cert-manager: add tls events
  • +
  • 7034f5d (controller) - config: deploy according to procfile_type
  • +
  • 5554d8f (controller) - config: add typed_values
  • +
  • 2c5bbad (controller) - auth: add token api
  • +
  • 410d34e (database) - charts: reuses the value from an existing secret and config
  • +
  • 693e4d1 (imagebuilder) - pipeline: add dryccfile support
  • +
  • 7d9cc06 (imagebuilder) - config: add typed values
  • +
  • 854e171 (passport) - charts: reuses the value from an existing secret and config
  • +
  • 7ac9255 (passport) - oauth2: add authorization code for any grant type
  • +
  • 4517547 (rabbitmq) - charts: reuses the value from an existing secret and config
  • +
  • bccfcb4 (redis) - charts: reuses the value from an existing secret and config
  • +
  • d887605 (registry) - charts: reuses the value from an existing secret and config
  • +
  • ff09e5b (storage) - charts: reuses the value from an existing secret and config
  • +
  • c6e2ac8 (timeseries) - charts: reuses the value from an existing secret and config
  • +
  • 22c4c77 (workflow-cli) - apps: change drycc run to async
  • +
  • a9e6369 (workflow-cli) - ps: add pod logs support
  • +
  • 2bc31c8 (workflow-cli) - limits: add limits plan support
  • +
  • f40398a (workflow-cli) - pipeline: add dryccfile support
  • +
  • 03638ff (workflow-cli) - tls: add tls events
  • +
  • 9113627 (workflow-cli) - config: add typed values
  • +
  • 43ee760 (workflow-cli) - auth: add tokens api
  • +
+

Fixes

+
    +
  • 50dfe64 (builder) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • ab09b24 (controller) - healthcheck: delete outdated code
  • +
  • 52019b5 (controller) - services: default PORT change error
  • +
  • f57ae42 (controller) - certificate: failed to create certificate
  • +
  • 30c3f54 (controller) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • dbba43a (controller) - service: update port error
  • +
  • e0459c5 (controller) - copy: use deepcopy replace copy
  • +
  • 2122479 (controller) - charts: failed to call webhook
  • +
  • 53d9977 (controller) - signals: config limits handle error
  • +
  • afda287 (controller) - limits: always set default
  • +
  • b350cb8 (database) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • b48a422 (fluentbit) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 7cebca2 (gateway) - cert-manager: auto tls error
  • +
  • 190c19b (imagebuilder) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 2c6a6f9 (logger) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 10bb98d (monitor) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • f8225dc (passport) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 06db66c (prometheus) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • f4aff72 (rabbitmq) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 88c18ff (redis) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 5dcc19d (registry) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 092a939 (registry-proxy) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 3597ac9 (storage) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 5a49b35 (timeseries) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 0c4a48a (workflow-cli) - tls: change issuer options
  • +
  • 06a2511 (workflow-cli) - tls: info error
  • +
+

Maintenance

+
    +
  • 2f7617e (builder) - go: bump controller-sdk-go version
  • +
  • aae2f29 (builder) - charts: add diagnostic mode
  • +
  • 7304980 (builder) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 30b648b (builder) - charts: change canary app version
  • +
  • 2afa006 (builder) - controller-sdk-go: bump version
  • +
  • d127a90 (builder) - config: add typed values
  • +
  • 32fdfd0 (controller) - charts: add diagnostic mode
  • +
  • 0974942 (controller) - woodpecker: migrations woodpecker-ci to 2
  • +
  • f401e08 (controller) - python: bump python 3.12
  • +
  • c565959 (controller) - celery: remove retrieve_resource task
  • +
  • 47be1a1 (controller) - requirements: bump drf 3.15.1
  • +
  • 99f7468 (controller) - charts: add config to values.yaml
  • +
  • 7d17f5c (controller) - scale: prohibit scale when there is a running pipeline
  • +
  • f09e1c9 (controller) - resource: sort services and plans
  • +
  • e817505 (controller) - limits: change default cpu and gpu name
  • +
  • 5531b2f (controller) - auth: add password login
  • +
  • 27473f7 (controller) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs
  • +
  • c1ee1c7 (controller) - deps: bump aiohttp from 3.9.3 to 3.9.4 in /rootfs
  • +
  • affbcb5 (database) - postgres: add patroni and postgres params (#15)
  • +
  • f9e4eda (database) - dockerfile: install vi
  • +
  • 008b7b6 (database) - dockerfile: install vim instand of vi
  • +
  • dbbfee1 (database) - charts: add diagnostic mode
  • +
  • 2e26c33 (database) - woodpecker: migrations woodpecker-ci to 2
  • +
  • a1b81f2 (database) - charts: change canary app version
  • +
  • bc725e8 (fluentbit) - charts: add diagnostic mode
  • +
  • 5d73886 (fluentbit) - woodpecker: migrations woodpecker-ci to 2
  • +
  • b85072d (fluentbit) - charts: change canary app version
  • +
  • 761174d (gateway) - gateway: change secrets name
  • +
  • 1c304da (gateway) - woodpecker: migrations woodpecker-ci to 2
  • +
  • b919a4c (gateway) - charts: change canary app version
  • +
  • 3cea298 (imagebuilder) - charts: allow all dns
  • +
  • 653bcbe (imagebuilder) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 59daeab (imagebuilder) - charts: change canary app version
  • +
  • 2834a5a (logger) - charts: add diagnostic mode
  • +
  • 6685492 (logger) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 191cdaf (logger) - charts: change canary app version
  • +
  • b3c3cfa (monitor) - charts: add diagnostic mode
  • +
  • 796799d (monitor) - grafana: add node metrics dashboard
  • +
  • ef2a222 (monitor) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 9c83090 (monitor) - charts: change canary app version
  • +
  • 1a97c2c (passport) - charts: add diagnostic mode
  • +
  • 353e1ae (passport) - logger: add oauth2_provider logger config
  • +
  • fe735c0 (passport) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 41d6144 (passport) - charts: change canary app version
  • +
  • 979d474 (passport) - python: bump python 3.12
  • +
  • e9f41a1 (passport) - requirements: bump drf 3.15.1
  • +
  • f479f4d (passport) - charts: add migrate job
  • +
  • ad9abf6 (passport) - passport: migrations add run_before
  • +
  • 95ac667 (passport) - passport: optimize the use of master and slave database rules
  • +
  • 204f7fc (passport) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs
  • +
  • 90a6410 (prometheus) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 2d8eb44 (prometheus) - charts: change canary app version
  • +
  • 9687a17 (rabbitmq) - charts: add diagnostic mode
  • +
  • 35d3d5b (rabbitmq) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 6a6564d (rabbitmq) - charts: change canary app version
  • +
  • cb6722f (redis) - charts: add diagnostic mode
  • +
  • 9553497 (redis) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 1c8dc07 (redis) - charts: change canary app version
  • +
  • 9fa2a32 (registry) - charts: add diagnostic mode
  • +
  • 9b09e51 (registry) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 7dbd390 (registry) - charts: change canary app version
  • +
  • e1d2a33 (registry-proxy) - charts: add diagnostic mode
  • +
  • 3eabfdd (registry-proxy) - charts: remove default limits
  • +
  • f8754da (registry-proxy) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 7df7316 (registry-proxy) - charts: change canary app version
  • +
  • 861d3b8 (storage) - filer: modify the default parameters of the filer
  • +
  • 5fa08da (storage) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 22c4620 (storage) - charts: change canary app version
  • +
  • 6c1e29c (timeseries) - postgres: add patroni params
  • +
  • e280d3f (timeseries) - dockerfile: install vi
  • +
  • 5213617 (timeseries) - dockerfile: install vim instand of vi
  • +
  • a569a57 (timeseries) - charts: add diagnostic mode
  • +
  • b93ec70 (timeseries) - woodpecker: migrations woodpecker-ci to 2
  • +
  • ff3b870 (timeseries) - charts: change canary app version
  • +
  • e334f74 (workflow-cli) - healthcheck: delete outdated healthcheck style
  • +
  • 4f8b960 (workflow-cli) - auth: add password login
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.7.5

+
New Drycc Workflow Release v1.7.5
+ +

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.

+

Workflow ## v1.7.4 -> v1.7.5

+

Releases

+
    +
  • builder v1.5.0 -> v1.5.1
  • +
  • controller v1.6.3 -> v1.7.0
  • +
  • logger v1.3.2 -> v1.3.3
  • +
  • storage v0.0.3 -> v0.0.4
  • +
  • redis v1.3.1 -> v1.3.2
  • +
  • rabbitmq v1.2.0 -> v1.2.1
  • +
  • registry v1.2.1 -> v1.2.2
  • +
  • workflow-cli v1.5.1 -> v1.5.2
  • +
+

Features

+
    +
  • 95d130a (controller) - controller: volume support nfs
  • +
+

Fixes

+
    +
  • ee2ee15 (controller) - controller: container entrypoint error
  • +
  • 03ea4f8 (controller) - controller: class property have been deprecated in python 3.11
  • +
  • 5f04d17 (controller) - controller: miss err msg
  • +
  • 27972a3 (controller) - controller: load_db_state_to_k8s err
  • +
  • a005d62 (controller) - controller: volume repeat path no error
  • +
  • c7a5ba6 (rabbitmq) - rabbitmq: cpu usage to high
  • +
  • 45c2077 (workflow-cli) - workflow-cli: miss err msg
  • +
  • bc738bd (workflow-cli) - workflow-cli: volumes list format
  • +
+

Maintenance

+
    +
  • 35e1c06 (builder) - builder: bump golang 1.22
  • +
  • 26caa36 (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.10
  • +
  • e625c2f (logger) - logger: bump golang 1.22
  • +
  • bfa500d (redis) - redis: headless svc does not require ports
  • +
  • 330209a (registry) - registry: headless svc does not require ports
  • +
  • 48c42eb (storage) - storage: change volume index to leveldb
  • +
  • f4fde9d (storage) - storage: add volume size limit
  • +
  • 33e3684 (workflow-cli) - workflow-cli: volume support nfs
  • +
  • 48d5950 (workflow-cli) - workflow-cli: bump golang 1.22
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.7.6

+
New Drycc Workflow Release v1.7.6
+ +

Workflow ## v1.7.5 -> v1.7.6

+

Releases

+
    +
  • storage v0.0.4 -> v0.0.5
  • +
+

Maintenance

+
    +
  • 6cb63b6 (storage) - seaweedfs: bump version 3.63
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.7.2

+
New Drycc Workflow Release v1.7.2
+ +

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.

+

Workflow ## v1.7.1 -> v1.7.2

+

Releases

+
    +
  • controller v1.6.0 -> v1.6.1
  • +
  • logger v1.3.1 -> v1.3.2
  • +
  • storage v0.0.1 -> v0.0.2
  • +
  • timeseries v0.0.1 -> v0.0.2
  • +
  • prometheus v0.1.0 -> v0.1.1
  • +
  • workflow-cli v1.5.0 -> v1.5.1
  • +
+

Fixes

+
    +
  • 2fe80a6 (controller) - resources: after resources instance update, could not delete (#111)
  • +
  • a4082ad (controller) - controller: resource status and binding
  • +
  • e9bfccc (controller) - controller: fix multiple volumes mount at one dir error (#116)
  • +
  • 58d2b4c (logger) - logger: redis conn error block
  • +
  • 7cb2700 (prometheus) - prometheus: prometheus config basic_auth
  • +
  • 7838c6b (storage) - storage: random accesskey secretkey
  • +
  • d9dcdfb (storage) - storage: pod restart loses data
  • +
  • 3cbdd29 (storage) - storage: tipd cannot start after deleting pod
  • +
  • be7e11f (storage) - storage: jq command not found
  • +
  • 878f674 (storage) - storage: charts updateStrategy error
  • +
  • 06cfe56 (timeseries) - timeseries: the data node ip is incorrect
  • +
+

Maintenance

+
    +
  • 7f29f5a (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 async
  • +
  • dc6f45e (controller) - controller: add channel for pod exec
  • +
  • af4f3a7 (controller) - controller: avoid error when secret no data field (#117)
  • +
  • ca27956 (controller) - controller: add pod default security
  • +
  • b2e9c64 (prometheus) - charts: node-exporter mount root (#2)
  • +
  • 3cdb2b6 (storage) - storage: bump seaweedfs 3.61
  • +
  • 00dd2fd (storage) - storage: add csi daemonset updateStrategy
  • +
  • 48e763c (storage) - storage: add drycc storage upgrade document
  • +
  • 841df90 (storage) - storage: bump seaweedfs 3.62
  • +
  • cefd52e (timeseries) - timeseries: add check data node exists
  • +
  • ad1c46e (workflow-cli) - resources: resources instance add message
  • +
  • 9f955c2 (workflow-cli) - workflow-cli: add short options cpu
  • +
  • 65399ef (workflow-cli) - workflow-cli: add tty resize support
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.7.0

+
New Drycc Workflow Release v1.7.0
+ +

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.

+

Workflow ## v1.6.0 -> v1.7.0

+

Releases

+
    +
  • builder v1.4.0 -> v1.5.0
  • +
  • controller v1.5.1 -> v1.6.0
  • +
  • database v1.2.0 -> v1.2.1
  • +
  • passport v1.1.0 -> v1.2.0
  • +
  • imagebuilder v1.1.0 -> v1.1.1
  • +
  • fluentbit v0.0.0 -> v0.0.1
  • +
  • logger v1.3.0 -> v1.3.1
  • +
  • storage v0.0.0 -> v0.0.1
  • +
  • gateway v0.0.0 -> v0.0.1
  • +
  • monitor v1.3.0 -> v1.4.0
  • +
  • redis v1.3.0 -> v1.3.1
  • +
  • timeseries v0.0.0 -> v0.0.1
  • +
  • prometheus v0.0.0 -> v0.1.0
  • +
  • rabbitmq v1.1.0 -> v1.2.0
  • +
  • registry v1.2.0 -> v1.2.1
  • +
  • registry-proxy v1.2.0 -> v1.2.1
  • +
+

Features

+
    +
  • fcbebda (builder) - builder: use TCPRoute expose service
  • +
  • d02bb5d (controller) - controller: support app dns policy config
  • +
  • 9aa968e (controller) - controller: add svc type support
  • +
  • 62e2d34 (controller) - controller: improve the services api
  • +
  • 4393755 (controller) - controller: use gateway replace ingress
  • +
  • 323045d (controller) - controller: add canary support
  • +
  • 3f81c97 (controller) - gateways: add addresses field
  • +
  • 4e64aa7 (controller) - gateways: add addresses field
  • +
  • 02ad581 (monitor) - grafana: add pd tikv dashboard
  • +
  • 2a9e2b0 (monitor) - monitor: add storage monitor
  • +
  • 41d5057 (monitor) - grafana: data source change to prometheus
  • +
  • ec035d1 (monitor) - monitor: usegateway replace ingress
  • +
  • c694c98 (monitor) - grafana: add drycc storage seaweedfs dashboard
  • +
  • 1e1fdc8 (passport) - passport: use gateway replace ingress
  • +
  • ffdb408 (prometheus) - prometheus: use gateway replace ingress
  • +
  • 04152b9 (rabbitmq) - rabbitmq: use gateway replace ingress
  • +
+

Fixes

+
    +
  • 0499500 (builder) - builder: manifest error
  • +
  • 642491d (builder) - builder: no build log
  • +
  • 873d146 (controller) - controller: do not set entrypoint when no procfile
  • +
  • d9028c5 (controller) - controller: pip8 error
  • +
  • 3efcfb7 (controller) - controller: manifest error
  • +
  • 18a3a1a (controller) - controller: miss service error
  • +
  • 94f796c (controller) - controller: drycc run pod should not restart
  • +
  • 80f3161 (controller) - controller: monitor query error
  • +
  • b76f2c5 (controller) - controller: read websocket delay
  • +
  • b6e068e (controller) - controller: metrics sql tpl, gateway pod should not restart, cleanup old rs, update monitor datatbase config
  • +
  • ad9adc6 (controller) - controller: rabbitmq sharding err
  • +
  • 6773907 (controller) - controller: default k8s pod annotaions
  • +
  • ffcf1f9 (controller) - controller: under-indented for visual indent
  • +
  • 3afd0cf (controller) - controller: charts env error
  • +
  • 769bb8b (database) - database: manifest error
  • +
  • 769bb8b (database) - database: label conflict error
  • +
  • 6a321c5 (database) - database: link error
  • +
  • 558feae (fluentbit) - fluentbit: build charts error
  • +
  • 98d8a2a (gateway) - fixup
  • +
  • 8b5dde1 (gateway) - gateway: secretName
  • +
  • 702866d (gateway) - gateway: build status
  • +
  • f55dac1 (imagebuilder) - imagebuilder: manifest error
  • +
  • ac13b5f (imagebuilder) - imagebuilder: build svg
  • +
  • 6b7bbc5 (logger) - logger: manifest error
  • +
  • 0136b5c (monitor) - monitor: manifest error
  • +
  • f03d975 (passport) - passport: DRYCC_GRAFANA_DOMAIN error
  • +
  • b530ea8 (passport) - passport: manifest error
  • +
  • be5a0a7 (passport) - passport: change passport
  • +
  • 1596c7f (rabbitmq) - rabbitmq: manifest error
  • +
  • 0dc4f6f (rabbitmq) - rabbitmq: images-shard error
  • +
  • 43293ae (redis) - redis: manifest error
  • +
  • ca13b7d (registry) - registry: manifest error
  • +
  • ab5c793 (registry) - registry: garbage collect error
  • +
  • ab0fabc (registry-proxy) - registry-proxy: manifest error
  • +
  • dfc7236 (registry-proxy) - registry-proxy: daemon yaml format
  • +
  • 42c03be (storage) - storage: seaweedfs csi error
  • +
  • 453e41a (timeseries) - timeseries: could not register node
  • +
+

Docs

+
    +
  • 5433c89 (gateway) - gateway: add prerequisites
  • +
  • 2f0c5d8 (logger) - logger: change architecture
  • +
+

Maintenance

+
    +
  • bdd02eb (builder) - builder: use dynamic clusterrole name
  • +
  • 66b4b25 (builder) - builder: upgrade new controller-go-sdk
  • +
  • 219d86f (builder) - builder: upgrade go.mod
  • +
  • 91f2f14 (builder) - builder: use woodpecker replace drone
  • +
  • 9abca16 (builder) - woodpecker: use woodpecker ci build status
  • +
  • f43dd50 (builder) - deps: bump golang.org/x/net from 0.2.0 to 0.7.0
  • +
  • 0384c69 (builder) - builder: add chart appVersion
  • +
  • e3149b9 (builder) - builder: upgrade codename to bookworm
  • +
  • d88ea1b (builder) - builder: add codename build-arg
  • +
  • ba59030 (builder) - builder: upgrade go.mod
  • +
  • 1114dd7 (builder) - builder: bump common 1.1.2
  • +
  • fe50b62 (builder) - builder: change drycc gateway listener name
  • +
  • db3950c (builder) - builder: remove gateway route
  • +
  • 5a508bb (builder) - builder: use podman replace docker
  • +
  • bbb9029 (builder) - deps: bump golang.org/x/net from 0.12.0 to 0.17.0
  • +
  • f4e5d6c (builder) - builder: remove health url
  • +
  • 9111c8f (builder) - builder: remove io/ioutil
  • +
  • 1f36e3d (controller) - deps: bump django from 4.1.2 to 4.1.6 in /rootfs
  • +
  • e4ab434 (controller) - controller: use woodpecker replace drone
  • +
  • 9f0301e (controller) - deps: bump django from 4.1.6 to 4.1.7 in /rootfs
  • +
  • 3932423 (controller) - woodpecker: use woodpecker ci build status
  • +
  • ae8b6b4 (controller) - setting: support KUBERNETES_LIMITS env config
  • +
  • c10b9bc (controller) - controller: using the api_version instead of hard coding
  • +
  • e6908cd (controller) - controller: upgrade requirements
  • +
  • b0eba0c (controller) - controller: add route rules serializer
  • +
  • 2e4b6a4 (controller) - controller: add chart appVersion
  • +
  • 7d32b55 (controller) - controller: upgrade to bookworm
  • +
  • f2dc8dd (controller) - controller: add codename build-arg
  • +
  • 5739b83 (controller) - controller: use timescaledb replace influxdb
  • +
  • 53892cb (controller) - controller: add timeseries
  • +
  • 0fe0eae (controller) - controller: upgrade requirements
  • +
  • 18b2a91 (controller) - deps: bump aiohttp from 3.8.4 to 3.8.5 in /rootfs
  • +
  • f50874a (controller) - controller: bump common 1.1.2
  • +
  • 956cd08 (controller) - controller: change drycc gateway listener name
  • +
  • 9ab3ead (controller) - controller: remove passport url check
  • +
  • a24c7b0 (controller) - controller: remove gateway route
  • +
  • f7e539a (controller) - controller: change celery priority
  • +
  • ab77a52 (controller) - controller: use podman replace docker
  • +
  • 8e27501 (controller) - controller: dynamic app storage class
  • +
  • 385978b (controller) - controller: list_pods datetime format
  • +
  • b20362c (controller) - deps: bump django from 4.2.3 to 4.2.7 in /rootfs
  • +
  • e11ae1b (controller) - controller: add cluster migrate
  • +
  • ca6e9df (controller) - controller: async mount
  • +
  • 9a7fbfc (controller) - controller: remove FOSSA
  • +
  • 3d55279 (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs
  • +
  • d498a11 (controller) - controller: add measure loalancers
  • +
  • 249a985 (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs
  • +
  • b967f58 (controller) - deps: bump aiohttp from 3.8.6 to 3.9.0 in /rootfs (#107)
  • +
  • 8ca9ed6 (controller) - controller: no longer restrict reserved domain
  • +
  • 9ff6649 (database) - database: add init database configure
  • +
  • 9b4cd26 (database) - database: use dynamic clusterrole name
  • +
  • b59cde4 (database) - database: remove minio require
  • +
  • 86462f8 (database) - database: use woodpecker replace drone
  • +
  • 1e8555a (database) - database: add chart appVersion
  • +
  • 1b762d5 (database) - database: upgrade codename to bookworm
  • +
  • 9ffe1fd (database) - database: add codename build-arg
  • +
  • 69466d7 (database) - database: add database extension
  • +
  • beb4b62 (database) - database: bump common 1.1.2
  • +
  • 67e2714 (database) - database: use podman replace docker
  • +
  • 8f328f8 (fluentbit) - fluentbit: no limit buffer size for kube api
  • +
  • fc0552c (fluentbit) - fluentbit: use podman replace docker
  • +
  • 63a6cab (fluentbit) - fluentbit: change fluentbit match
  • +
  • 220f81a (fluentbit) - fluentbit: run as no-root
  • +
  • aec1393 (fluentbit) - fluentbit: change configmap name
  • +
  • 1af4fd2 (fluentbit) - fluentbit: change default stream name
  • +
  • bef90ad (gateway) - gateway: add route for gateway
  • +
  • d523ddb (gateway) - gateway: change drycc gateway listener name
  • +
  • d9137f4 (gateway) - gateway: add chart appVersion
  • +
  • 0425dd4 (gateway) - gateway: add customListeners
  • +
  • 3982b86 (imagebuilder) - imagebuilder: use woodpecker replace drone
  • +
  • 3e4e7a3 (imagebuilder) - imagebuilder: add chart appVersion
  • +
  • 8df6e8e (imagebuilder) - imagebuilder: upgrade stack version
  • +
  • a5601f7 (imagebuilder) - imagebuilder: add drycc_app env
  • +
  • 07465f8 (imagebuilder) - imagebuilder: upgrade to bookworm
  • +
  • 00d22d2 (imagebuilder) - imagebuilder: add codename build-arg
  • +
  • 0b7a24e (imagebuilder) - imagebuilder: upgrade podman/mc/caddy
  • +
  • a7d8be8 (imagebuilder) - imagebuilder: use podman replace docker
  • +
  • 6b2da83 (logger) - logger: use woodpecker replace drone
  • +
  • 8245b25 (logger) - woodpecker: use woodpecker ci build status
  • +
  • f811a74 (logger) - logger: add chart appVersion
  • +
  • 413f6f6 (logger) - logger: upgrade codename to bookworm
  • +
  • 2ac6b10 (logger) - logger: add codename build-arg
  • +
  • 2581426 (logger) - logger: bump redis to v9
  • +
  • 364b25a (logger) - logger: bump common 1.1.2
  • +
  • dc169a3 (logger) - logger: use fluentbit replace fluentd
  • +
  • d855d91 (logger) - logger: use podman replace docker
  • +
  • f767235 (monitor) - monitor: add off-cluster passport configure
  • +
  • ab23936 (monitor) - monitor: use dynamic clusterrole name
  • +
  • 47beee0 (monitor) - monitor: change tikv secret key
  • +
  • af7703f (monitor) - grafana: remove panel when component off-cluster
  • +
  • 1b870c2 (monitor) - monitor: use woodpecker replace drone
  • +
  • 4a5f1f1 (monitor) - grafana: up ldap api_url config
  • +
  • 143cabe (monitor) - monitor: add prometheus architecture diagram
  • +
  • 93091c2 (monitor) - woodpecker: use woodpecker ci build status
  • +
  • 0b7045a (monitor) - grafana: add dashboard kubernetes_deployment_metrics
  • +
  • 2fb1839 (monitor) - woodpecker: pipeline config VERSION, when build container image
  • +
  • e272416 (monitor) - monitor: add chart appVersion
  • +
  • abc0e53 (monitor) - monitor: upgrade codename to bookworm
  • +
  • 86cc01b (monitor) - monitor: add codename build-arg
  • +
  • 1cd849f (monitor) - monitor: add postgresql outputs
  • +
  • c3205c0 (monitor) - monitor: change default agent config
  • +
  • 8c802c0 (monitor) - monitor: add timeseries database
  • +
  • e9abc40 (monitor) - monitor: bump common 1.1.2
  • +
  • 6af66cd (monitor) - monitor: change drycc gateway listener name
  • +
  • d02d718 (monitor) - monitor: remove gateway route
  • +
  • 3509c29 (monitor) - monitor: use podman replace docker
  • +
  • ed7bfa2 (monitor) - monitor: optimize env PROMETHEUS_URL
  • +
  • da89bef (passport) - passport: charts codereview
  • +
  • 61c4a96 (passport) - passport: support init app config
  • +
  • 9101006 (passport) - passport: add initApplications to charts
  • +
  • 7dd7fa4 (passport) - passport: use woodpecker replace drone
  • +
  • 4400199 (passport) - woodpecker: use woodpecker ci build status
  • +
  • 6b2c546 (passport) - passport: change secret name to drycc-passport-auto-tls
  • +
  • c8bd824 (passport) - passport: upgrade requirements
  • +
  • aee5aef (passport) - passport: add chart appVersion
  • +
  • 2d81953 (passport) - passport: upgrade codename to bookworm
  • +
  • 9e66242 (passport) - passport: add codename build-arg
  • +
  • 0fca998 (passport) - passport: upgrade requirements
  • +
  • 3482528 (passport) - passport: bump common 1.1.2
  • +
  • 0c5ec93 (passport) - passport: change drycc gateway listener name
  • +
  • f7b8f53 (passport) - passport: remove gateway route
  • +
  • baf69da (passport) - passport: use podman replace docker
  • +
  • fcd45dd (passport) - passport: add cluster migrate
  • +
  • da6d32a (prometheus) - prometheus: add prometheus-config
  • +
  • 683de9e (prometheus) - prometheus: use podman replace docker
  • +
  • 3323300 (prometheus) - prometheus: remove gateway route
  • +
  • da1d356 (prometheus) - prometheus: change drycc gateway listener name
  • +
  • 4e7a936 (prometheus) - prometheus: bump common 1.1.2
  • +
  • 44c1c6f (prometheus) - prometheus: add codename build-arg
  • +
  • d1f1dda (prometheus) - prometheus: upgrade codename to bookworm
  • +
  • 0836fc1 (prometheus) - prometheus: add chart appVersion
  • +
  • 9e13232 (prometheus) - prometheus: add LICENSE
  • +
  • f53e14a (rabbitmq) - rabbitmq: remove auto user
  • +
  • 0ec7277 (rabbitmq) - rabbitmq: use woodpecker replace drone
  • +
  • f376a30 (rabbitmq) - woodpecker: use woodpecker ci build status
  • +
  • 51405d8 (rabbitmq) - rabbitmq: add chart appVersion
  • +
  • 463ca03 (rabbitmq) - rabbitmq: upgrade codename to bookworm
  • +
  • 1978a71 (rabbitmq) - rabbitmq: add codename build-arg
  • +
  • 139277f (rabbitmq) - rabbitmq: bump common 1.1.2
  • +
  • be49741 (rabbitmq) - rabbitmq: change drycc gateway listener name
  • +
  • 6d22518 (rabbitmq) - rabbitmq: remove gateway route
  • +
  • 0eb7833 (rabbitmq) - rabbitmq: add check shards
  • +
  • 9211063 (rabbitmq) - rabbitmq: erlang vm tuning optimization
  • +
  • 648a78d (rabbitmq) - rabbitmq: use podman replace docker
  • +
  • 0b43a4d (rabbitmq) - rabbitmq: add x-random exchange
  • +
  • ad1c4da (redis) - redis: use woodpecker replace drone
  • +
  • 3f37f92 (redis) - redis: add chart appVersion
  • +
  • e3bef7a (redis) - redis: upgrade codename to bookworm
  • +
  • 4e806d4 (redis) - redis: add codename build-arg
  • +
  • d5023be (redis) - redis: bump common 1.1.2
  • +
  • 98f5d6f (redis) - redis: use podman replace docker
  • +
  • 063f29e (registry) - registry: use woodpecker replace drone
  • +
  • 17bf8ae (registry) - woodpecker: use woodpecker ci build status
  • +
  • 7bbad15 (registry) - registry: add chart appVersion
  • +
  • 279154f (registry) - registry: upgrade codename to bookworm
  • +
  • 3e4ae84 (registry) - registry: add codename build-arg
  • +
  • fa322d6 (registry) - registry: bump common 1.1.2
  • +
  • 6c18fe0 (registry) - registry: use podman replace docker
  • +
  • 0bc8472 (registry) - registry: remove health url
  • +
  • 5dacd9f (registry) - registry: add wait-for-port check
  • +
  • fdeefc3 (registry) - registry: use headless
  • +
  • 08bf9f8 (registry) - registry: change registry port to 5000
  • +
  • 40bcea2 (registry) - registry: add registry push test
  • +
  • 871b8e7 (registry) - registry: add default env
  • +
  • 7f3b3ac (registry) - registry: bump registry 2.8.3
  • +
  • 569f15d (registry-proxy) - registry-proxy: use woodpecker replace drone
  • +
  • cc33caf (registry-proxy) - woodpecker: use woodpecker ci build status
  • +
  • 0002aab (registry-proxy) - registry-proxy: add chart appVersion
  • +
  • 40af10b (registry-proxy) - registry-proxy: upgrade codename to bookworm
  • +
  • c56b9df (registry-proxy) - registry-proxy: add codename build-arg
  • +
  • 9d5bfe0 (registry-proxy) - registry-proxy: use podman replace docker
  • +
  • e6a3350 (registry-proxy) - registry-proxy: change worker_processes to 1
  • +
  • 726f39d (storage) - storage: add volume compactionMBps
  • +
  • a5aa2d8 (storage) - storage: add threshold to vacuum and reclaim spaces
  • +
  • e687d04 (storage) - storage: delete disk type in single disk case
  • +
  • 75ee2e4 (storage) - storage: change datanode replicas to 4
  • +
  • c5fd7ba (storage) - storage: delete useless env
  • +
  • b3826ea (storage) - storage: add ssd hdd dir
  • +
  • 29881a0 (storage) - storage: add balance cronjob
  • +
  • c5a0f51 (storage) - storage: add defaultReplication for seaweedfs master
  • +
  • 543c7a2 (timeseries) - timeseries: use podman replace docker
  • +
  • 5376024 (timeseries) - timeseries: update timeseries-service-replica
  • +
  • 52e8520 (timeseries) - timeseries: bump common 1.1.2
  • +
  • f82657c (timeseries) - timeseries: add start script
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.6.0

+
New Drycc Workflow Release v1.6.0
+ +

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.

+

Workflow ## v1.5.0 -> v1.6.0

+

Releases

+
    +
  • builder v1.3.0 -> v1.4.0
  • +
  • controller v1.4.0 -> v1.5.0
  • +
  • passport v1.0.0 -> v1.1.0
  • +
  • database v1.1.0 -> v1.2.0
  • +
  • imagebuilder v1.0.1 -> v1.1.0
  • +
  • fluentd v1.2.0 -> v1.3.0
  • +
  • logger v1.2.0 -> v1.3.0
  • +
  • storage v1.2.0 -> v1.3.0
  • +
  • monitor v1.2.0 -> v1.3.0
  • +
  • redis v1.2.0 -> v1.3.0
  • +
  • influxdb v1.1.0 -> v1.2.0
  • +
  • rabbitmq v1.0.0 -> v1.1.0
  • +
  • registry v1.1.0 -> v1.2.0
  • +
  • registry-proxy v1.1.0 -> v1.2.0
  • +
+

Features

+
    +
  • 52517d9 (builder) - builder: update controller-sdk-go
  • +
  • 1d78ca0 (builder) - builder: add affinity
  • +
  • 26b6980 (builder) - builder: switch charts to oci
  • +
  • bfd4385 (controller) - controller: add get manager user status
  • +
  • 874208d (controller) - controller: unified measurement model
  • +
  • cadf98f (controller) - controller: add admission webhook
  • +
  • e0050c2 (controller) - controller: new measurement model
  • +
  • a11ba58 (controller) - controller: multi pod restart uses async
  • +
  • fb3c15d (controller) - controller: add check app owner status
  • +
  • 3d78b76 (controller) - controller: add resource services api
  • +
  • 3d6a201 (controller) - controller: add search apps api
  • +
  • 01c443a (controller) - controller: add KUBERNETES_CPU_MEMORY_RATIO parameter
  • +
  • 7c26232 (controller) - controller: add volume size limit
  • +
  • 3bee749 (controller) - controller: add annotations support
  • +
  • 23cd97c (controller) - controller: traefik v2 support
  • +
  • e37b7db (controller) - controller: add affinity
  • +
  • b3b367b (controller) - controller: add volume expand support
  • +
  • a4e154a (controller) - controller: add database replica support
  • +
  • 2f37216 (controller) - controller: switch wsgi to asgi
  • +
  • b3314a5 (controller) - controller: add pod exec api
  • +
  • 75df2dc (controller) - controller: add stream support for app logs
  • +
  • 4229bad (controller) - ccontroller: switch charts to oci
  • +
  • 89bb19b (database) - database: upgrade to pg14
  • +
  • 9f45a5d (database) - database: add hugepages support
  • +
  • c4008c9 (database) - database: add affinity
  • +
  • 411a7b2 (database) - postgres: use patroni
  • +
  • 64e5cb0 (database) - database: switch charts to oci
  • +
  • 2bab823 (fluentd) - fluentd: switch charts to oci
  • +
  • 337ba62 (imagebuilder) - imagebuilder: run podman as rootless
  • +
  • 4396ffa (imagebuilder) - imagebuilder: switch to oci charts
  • +
  • f37ae09 (influxdb) - influxdb: add affinity
  • +
  • 04503b2 (influxdb) - influxdb: add influxdb ha
  • +
  • 41ddad5 (influxdb) - influxdb: switch charts to oci
  • +
  • 2006480 (logger) - logger: use redis stream replace nsqd
  • +
  • ab23d17 (logger) - logger: add affinity
  • +
  • 81d4e9d (logger) - logger: switch charts to oci
  • +
  • c3d9796 (monitor) - monitor: add affinity
  • +
  • cd9de3c (monitor) - monitor: switch to oci charts
  • +
  • 318a73f (passport) - passport: add change user confirm
  • +
  • 79ef100 (passport) - passport: add re login at authorize
  • +
  • 6927bb5 (passport) - passport: add affinity
  • +
  • 3146a09 (passport) - passport: add google reCAPTCHA
  • +
  • 802abcd (passport) - passport: add replica database support
  • +
  • a0dcd1b (passport) - passport: switch wsgi to asgi
  • +
  • 4c9dbba (passport) - passport: switch charts to oci
  • +
  • 74825f7 (rabbitmq) - rabbitmq: add rabbitmq managentment ingress
  • +
  • 12cf7d6 (rabbitmq) - rabbitmq: add affinity
  • +
  • 103417d (rabbitmq) - rabbitmq: switch charts to oci
  • +
  • 5d428bb (redis) - redis: add affinity
  • +
  • a88c1a9 (redis) - redis: switch charts to oci
  • +
  • 541585d (registry) - registry: add affinity
  • +
  • e9ca9d4 (registry) - registry: add garbage-collect cronjob
  • +
  • ec62a59 (registry) - registry: switch charts to oci
  • +
  • fde0b07 (registry-proxy) - registry-proxy: switch charts to oci
  • +
  • be14eb4 (storage) - minio: add affinity
  • +
  • 51af696 (storage) - storage: add k8s csi support
  • +
  • 76a75d9 (storage) - storage: add cluster health checker
  • +
  • a17dc8c (storage) - storage: switch charts to oci
  • +
+

Fixes

+
    +
  • e4f44fb (builder) - builder: no error return
  • +
  • e38dfc7 (builder) - builderControllerHost/ControllerPort init error
  • +
  • ff9069f (controller) - controller: influxdb query error
  • +
  • f7f5069 (controller) - controller: authentication 500
  • +
  • 7e297a8 (controller) - controller: add check remote user status
  • +
  • 9db28e1 (controller) - controller: celery MaxRetriesExceededError
  • +
  • 4bcff08 (controller) - controller: wrong name
  • +
  • d69fde2 (controller) - controller: traefik ingress create error
  • +
  • a3ad743 (controller) - fixup(controller: user login error
  • +
  • 662c8dd (controller) - controller: change influxdb port
  • +
  • 957bdf6 (controller) - controller: validate rsa key pairing before storage
  • +
  • 419ec4c (controller) - controller: kubernetes pod/exec cluster role
  • +
  • a67edaa (controller) - controller: Cannot routing:disable
  • +
  • e09e214 (controller) - controller: allowlist cannot remove
  • +
  • 318b126 (controller) - controller: domains update error
  • +
  • 92855eb (database) - database: premission denied
  • +
  • bde945a (database) - fixup(postgres: support arm, fix Failed to build psutil
  • +
  • 7854d45 (database) - fixup(postgres: user name converted to lowercase letters
  • +
  • 57b2a07 (fluentd) - fluentd: ifconfig_path not found
  • +
  • 20e72b9 (imagebuilder) - imagebuilder: upgrade pack version
  • +
  • 651db8a (imagebuilder) - imagebuilder: chown uid gid order
  • +
  • d2e9164 (influxdb) - influxdb: proxy not running
  • +
  • 3a1d361 (monitor) - monitor: charts naming
  • +
  • d754ae0 (monitor) - monitor: telegraf init error
  • +
  • 63f9e34 (monitor) - monitor: affinity error
  • +
  • 95ae1e5 (passport) - passport: yarn build fail
  • +
  • 3f5365e (passport) - passport: wrong name
  • +
  • 907f17b (passport) - passport: change uid gid to 1001
  • +
  • e3911e0 (passport) - passport: ‘registration_done’ not found
  • +
  • 2ace5f0 (passport) - passport: ui style
  • +
  • b3ba1e1 (passport) - passport privacy policy link
  • +
  • 172e9c8 (passport) - passport: check databaseReplicaUrl error
  • +
  • a3aeb70 (rabbitmq) - passport: change uid gid to 1001
  • +
  • 5c73dcf (redis) - reids: DRYCC_REGISTY misspelling
  • +
  • d7e3baf (redis) - redis: env miss
  • +
  • cadaa91 (registry) - registry: set gid uid to 1001
  • +
  • d524217 (registry) - registry: storage run error
  • +
  • 854f912 (registry) - registry: chown uid gid order
  • +
  • e642bb7 (registry-proxy) - registry-proxy: containerPort error
  • +
  • 8dfd029 (registry-proxy) - registry-proxy: chown uid gid order
  • +
  • bbea364 (storage) - minio: premission denied
  • +
  • 97deba1 (storage) - storage: node unimplemented error
  • +
  • b9bdeff (storage) - storage: pd can not connect each other
  • +
+

Style

+
    +
  • 1edb10c (controller) - controller: database convention over configuration
  • +
  • 1960cc3 (database) - database: database name convention over configuration
  • +
  • 06d1f5d (imagebuilder) - imagebuilder: URL to Url
  • +
  • b8a8941 (passport) - passport: database convention over configuration
  • +
+

Maintenance

+
    +
  • 8e9a199 (builder) - builder: upgrade controller-sdk-go
  • +
  • 4840151 (builder) - builder: use exec runner replace docker runner
  • +
  • 68ccfb1 (builder) - builder: canonical charts naming
  • +
  • 8f971cb (builder) - builder: provide any additional service annotations
  • +
  • fe2c55d (builder) - dockerfile: use drycc/base image
  • +
  • 2b5e706 (builder) - dockerfile: change user and workdir
  • +
  • 7a6c8d3 (builder) - builder: set gid uid to 1001
  • +
  • fe494f7 (builder) - dockerfile: use uid gid
  • +
  • a7c8752 (builder) - builder: change nodes to pod affinity
  • +
  • eb2e94c (builder) - database: bump mc 2022.04.01.23.44.48
  • +
  • cfaae66 (builder) - builder: use registry.drycc.cc replace docker.io
  • +
  • d7d2890 (builder) - builder: change default imagebuilder registry
  • +
  • ecfdb19 (builder) - imagebuilder: change python-dev registry
  • +
  • 6da17f4 (builder) - builder: https://github.com/minio/minio/issues/14331
  • +
  • 1a57e5b (builder) - builder: https://github.com/minio/minio/issues/14331
  • +
  • f1464fa (builder) - builder: https://github.com/minio/minio/issues/13799
  • +
  • b1e1c4f (builder) - builder: use env replace creds volume
  • +
  • 71a4145 (builder) - builder: bump go.mod
  • +
  • 3567688 (builder) - builder: fine management affinity
  • +
  • 73ea38b (builder) - builder: change storage to minio
  • +
  • 1f91321 (builder) - builder: use testify replace assert
  • +
  • d148b9c (builder) - builder: add check storage health
  • +
  • b768101 (builder) - builder: change initContainers
  • +
  • 1b3bec3 (builder) - builder: add replicas
  • +
  • 5cb0d61 (builder) - builder: upgrade to latest controller-sdk-go
  • +
  • 98b9d58 (builder) - builder: upgrade new require
  • +
  • 65817c3 (builder) - builder: change drycc.cc to www.drycc.cc
  • +
  • 4e3f9d0 (controller) - controller: add celery retry mechanism
  • +
  • f6716fe (controller) - controller: change cronjob name
  • +
  • eb60693 (controller) - controller: refine celery task priority
  • +
  • 66905e9 (controller) - controller: change manager auth
  • +
  • ea20c41 (controller) - controller: remove start/stop api
  • +
  • 4c8fc80 (controller) - controller: improve tasks error handling
  • +
  • cf7402e (controller) - controller: add blocklist api
  • +
  • 80f14dd (controller) - controller: use get_user_model replace auth.User
  • +
  • ffc7bb7 (controller) - controller: use JSONField replace ArrayField
  • +
  • 370df8c (controller) - controller: add validate metric
  • +
  • 29084ce (controller) - controller: use user id request manager api
  • +
  • 718fe12 (controller) - controller change urlpatterns order
  • +
  • 71f4042 (controller) - controller: measurements uses lowercase letters
  • +
  • e5123ea (controller) - controller: change resource unit to number
  • +
  • 18fee9a (controller) - deps: bump celery from 5.1.2 to 5.2.2 in /rootfs
  • +
  • ffca6c1 (controller) - controller: use exec runner replace docker runner
  • +
  • 9ec12e1 (controller) - controller: simplify drone configuration
  • +
  • 4b4749e (controller) - controller: set default CSRF_COOKIE_SECURE false
  • +
  • 2ef6338 (controller) - deps: bump django from 3.2.5 to 3.2.10 in /rootfs
  • +
  • c7570d0 (controller) - deps: bump django from 3.2.10 to 3.2.11 in /rootfs
  • +
  • 8b17bc1 (controller) - controller: canonical charts naming
  • +
  • c928fb0 (controller) - controller: use rabbitmq cluster
  • +
  • f917185 (controller) - controller: provide any additional service annotations
  • +
  • 22a8f63 (controller) - deps: bump django from 3.2.11 to 3.2.12 in /rootfs
  • +
  • 3cc3b00 (controller) - dockerfile: use drycc/base image
  • +
  • ee274f6 (controller) - controller: set venv profile
  • +
  • ce6b069 (controller) - controller: set gid uid to 1001
  • +
  • 3a105d3 (controller) - dockerfile: use uid gid
  • +
  • 15f9b0e (controller) - controller: code review
  • +
  • 01e6fd9 (controller) - controller: use passport user id
  • +
  • 893ee31 (controller) - oauth2: update user info pipline
  • +
  • 3028fb4 (controller) - user: set AnonymousUser username
  • +
  • 5daf82d (controller) - controller: set worker_cancel_long_running_tasks_on_connection_loss
  • +
  • 61f2c53 (controller) - controller: change nodes to pod affinity
  • +
  • 88feb1d (controller) - imagebuilder: python=3.10.4 rabbitmq=3.9.14
  • +
  • 914e03f (controller) - controller: use registry.drycc.cc replace docker.io
  • +
  • a5bb548 (controller) - controller: change python-dev registry
  • +
  • 3ecdd7c (controller) - controller: add a separate rabbitmqUrl configuration
  • +
  • 967cb11 (controller) - controller: remove APP_STORAGE
  • +
  • 473d2b5 (controller) - controller: use env replace creds volume
  • +
  • e410d4c (controller) - deps: bump django from 3.2.12 to 3.2.13 in /rootfs
  • +
  • c6ef777 (controller) - controller: simplified passport config
  • +
  • 0fd3233 (controller) - controller: remove settings hardcode
  • +
  • a64e99c (controller) - controller: change passport config
  • +
  • 62aba25 (controller) - controller: set cronjob timezone to utc
  • +
  • 760b70b (controller) - controller: change default ratio
  • +
  • 8dffc3a (controller) - controller: fine management affinity
  • +
  • 26043c4 (controller) - controller: change default app storage
  • +
  • 608bd8d (controller) - deps: bump django from 3.2.13 to 3.2.14 in /rootfs
  • +
  • 18ed0c2 (controller) - controller: remove conjob affinity
  • +
  • add6712 (controller) - controller: add volume expand support use patch
  • +
  • cc1ad13 (controller) - controller: add startupProbe
  • +
  • 0e9a603 (controller) - controller: add clearsocial cronjob
  • +
  • eb6f05d (controller) - controller: change initContainers
  • +
  • 762c676 (controller) - controller: change replicas
  • +
  • abd7e8c (controller) - deps: bump django from 3.2.14 to 3.2.15 in /rootfs
  • +
  • 07fdf1b (controller) - controller: remove database conn_max_age
  • +
  • ef8e41f (controller) - controller: add database replica check
  • +
  • 79143f2 (controller) - controller: upgrade new require
  • +
  • a624048 (controller) - controller: add app.refresh func annotation
  • +
  • b22d367 (controller) - controller: optimize app refresh timing
  • +
  • fe98f0c (database) - database: use exec runner replace docker runner
  • +
  • 5e00c11 (database) - database: canonical charts naming
  • +
  • d2cb860 (database) - database: disable huge_pages
  • +
  • 197d80d (database) - database: add persistence
  • +
  • 1c3e645 (database) - database: provide any additional service annotations
  • +
  • 37730ab (database) - dockerfile: use drycc/base image
  • +
  • 5014112 (database) - dockerfile: change entrypoint
  • +
  • 29b538e (database) - database: change nodes to pod affinity
  • +
  • c2bb074 (database) - database: bump python 3.10.4 and mc 2022.04.01.23.44.48
  • +
  • 077a4e9 (database) - database: use registry.drycc.cc replace docker.io
  • +
  • 560bdb9 (database) - database: change python-dev registry
  • +
  • 1e54b55 (database) - database: https://github.com/minio/minio/issues/14331
  • +
  • d646672 (database) - database: https://github.com/minio/minio/issues/13799
  • +
  • a6ac4e3 (database) - database: use env replace creds volume
  • +
  • 9618d87 (database) - database: fine management affinity
  • +
  • b823273 (database) - database: change minio to storage
  • +
  • 7bd5a90 (database) - database: add check storage health
  • +
  • 20c6d96 (database) - database: fix storage run error
  • +
  • 8bde830 (database) - database: upgrade to pg 14.5
  • +
  • a33b5e5 (fluentd) - fluentd: update plugins
  • +
  • eed7a78 (fluentd) - fluentd: update filter kubernetes setting
  • +
  • cc83dd8 (fluentd) - fluentd: update elasticsearch store setting and support exclude specific container logs
  • +
  • ba2feb2 (fluentd) - fluentd: use exec runner replace docker runner
  • +
  • d528676 (fluentd) - fluentd: simplify drone configuration
  • +
  • dece82d (fluentd) - fluentd: canonical charts naming
  • +
  • 4e0a802 (fluentd) - fluend: replace nsqd with redis
  • +
  • 15ceca0 (fluentd) - dockerfile: use drycc/base image
  • +
  • a7f619f (fluentd) - dockerfile: change workdir
  • +
  • 9adf5ed (fluentd) - database: bump fluentd 1.14.6
  • +
  • 50c14c2 (fluentd) - fluentd: use registry.drycc.cc replace docker.io
  • +
  • 83171b1 (fluentd) - fluentd: change python-dev registry
  • +
  • ec83581 (fluentd) - fluentd: unified reids declaration
  • +
  • 07c63e2 (fluentd) - fluentd: upgrade fluentd 1.15.2
  • +
  • 65df9be (imagebuilder) - imagebuilder: update pack version
  • +
  • 66cab35 (imagebuilder) - imagebuilder: use dind replace go-dev
  • +
  • 0c82060 (imagebuilder) - imagebuilder: use exec runner replace docker runner
  • +
  • 8146da9 (imagebuilder) - imagebuilder: canonical charts naming
  • +
  • 7d97241 (imagebuilder) - dockerfile: use drycc/base image
  • +
  • 07e805c (imagebuilder) - imagebuilder: change default buildpack
  • +
  • 8d1038d (imagebuilder) - imagebuilder: upgrade podman to 4.0.1
  • +
  • 62d3687 (imagebuilder) - imagebuilder: change workdir to /workspace
  • +
  • da8bfb0 (imagebuilder) - imagebuilder: change uid gid to 1001
  • +
  • d44e3bc (imagebuilder) - imagebuilder: upgrade stack
  • +
  • 5b0c7e6 (imagebuilder) - imagebuilder: use registry.drycc.cc replace docker.io
  • +
  • f74cbf6 (imagebuilder) - imagebuilder: add defaultBuildpacksURL
  • +
  • 941d493 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/14331
  • +
  • 449be91 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/13799
  • +
  • 63b0523 (imagebuilder) - imagebuilder: use env replace creds volume
  • +
  • 4e8a6e5 (imagebuilder) - imagebuilder: add imagebuilder config
  • +
  • 2d891f5 (imagebuilder) - imagebuilder: change minio to storage
  • +
  • addceda (imagebuilder) - imagebuilder: upgrade new require
  • +
  • a6e569f (imagebuilder) - imagebuilder: pack_build add –env-file parameter
  • +
  • 6191ff5 (influxdb) - influxdb: use exec runner replace docker runner
  • +
  • dc3f8c7 (influxdb) - influxdb: canonical charts naming
  • +
  • 6b5c819 (influxdb) - influxdb: new ingress style
  • +
  • 68b381d (influxdb) - influxdb: provide any additional service annotations
  • +
  • ea20eb8 (influxdb) - dockerfile: use drycc/base image
  • +
  • 64c0a71 (influxdb) - influxdb: set gid uid to 1001
  • +
  • a709ca1 (influxdb) - influxdb: use DRYCC_UID DRYCC_GID env
  • +
  • 740dff0 (influxdb) - influxdb: use common affinity template
  • +
  • e035673 (influxdb) - influxdb: change nodes to pod affinity
  • +
  • f1cefbd (influxdb) - influxdb: use registry.drycc.cc replace docker.io
  • +
  • a00100e (influxdb) - influxdb: fine management affinity
  • +
  • 9d165ef (influxdb) - influxdb: add probe
  • +
  • bee7fff (influxdb) - influxdb: upgrade to influxdb 2.4.0
  • +
  • 254914c (logger) - logger: use exec runner replace docker runner
  • +
  • 8d91c68 (logger) - logger: canonical charts naming
  • +
  • b6d2182 (logger) - logger: provide any additional service annotations
  • +
  • c35e59a (logger) - dockerfile: use drycc/base image
  • +
  • a63c070 (logger) - logger: change workdir to /workspace
  • +
  • a594b28 (logger) - logger: set gid uid to 1001
  • +
  • 9a90e22 (logger) - dockerfile: use uid gid
  • +
  • 36493b4 (logger) - logger: use common affinity template
  • +
  • 897a3a5 (logger) - logger: change nodes to pod affinity
  • +
  • 03b32ab (logger) - logger: use registry.drycc.cc replace docker.io
  • +
  • a50ba5f (logger) - logger: change python-dev registry
  • +
  • 23187a3 (logger) - logger: unified reids declaration
  • +
  • aaa129a (logger) - logger: fine management affinity
  • +
  • be4f656 (logger) - logger: add replicas
  • +
  • 7c25459 (logger) - charts: add NetworkPolicy
  • +
  • 6810149 (logger) - logger: remove memory storage
  • +
  • a918c50 (logger) - logger: add .vscode to .gitignore
  • +
  • a415210 (logger) - logger: add log follow support
  • +
  • 59b1da3 (logger) - logger: upgrade new require
  • +
  • 27cc151 (monitor) - monitor: use exec runner replace docker runner
  • +
  • 07d6a9d (monitor) - monitor: canonical charts naming
  • +
  • 1054357 (monitor) - monitor: use redis default port
  • +
  • e3673df (monitor) - monitor: remove nsqd
  • +
  • fc9dd3e (monitor) - monitor: new ingress style
  • +
  • 856a898 (monitor) - monitor: add default user env
  • +
  • 9857535 (monitor) - monitor: add random user
  • +
  • 38b5a04 (monitor) - grafana: oauth auto login
  • +
  • 5dfc579 (monitor) - monitor: upgrade version
  • +
  • e121b5a (monitor) - monitor: provide any additional service annotations
  • +
  • 84462a0 (monitor) - dockerfile: use drycc/base image
  • +
  • b9e8ce8 (monitor) - monitor: chore(imagebuilder): change uid gid to 1001
  • +
  • 05ee8ab (monitor) - dockerfile: use uid gid
  • +
  • e1fa68e (monitor) - monitor: use common affinity template
  • +
  • b8f302b (monitor) - monitor: change nodes to pod affinity
  • +
  • 4fc991f (monitor) - database: bump telegraf 1.22.0 and grafana 8.4.5
  • +
  • 21a2f6a (monitor) - monitor: use registry.drycc.cc replace docker.io
  • +
  • acc976f (monitor) - monitor: change python-dev registry
  • +
  • 62d76c1 (monitor) - monitor: unified reids declaration
  • +
  • b3c57ad (monitor) - monitor: optimize oauth2 configuration
  • +
  • 70af6b0 (monitor) - monitor: change passport config
  • +
  • 69f9a88 (monitor) - monitor: fine management affinity
  • +
  • 2fb278f (monitor) - monitor: rename influxdb port
  • +
  • 17548ff (monitor) - grafana: update dashborad
  • +
  • 69d7bbd (monitor) - grafana: influx dashborad disk size
  • +
  • 75db1b0 (monitor) - monitor: upgrade new grafana/telegraf
  • +
  • 80504a1 (monitor) - grafana: update influx and redis dashboard
  • +
  • f7078cb (monitor) - monitor:chown use env
  • +
  • 91ae0dd (passport) - passport: optimize login display
  • +
  • 2d3bbbc (passport) - passport: change drycc logo
  • +
  • 59790a7 (passport) - passport: make user email unique
  • +
  • faea034 (passport) - passport: use strtobool
  • +
  • 1fbf2bc (passport) - passport: use yarn replace npm
  • +
  • 119cac8 (passport) - passport: use exec runner replace docker runner
  • +
  • cff5062 (passport) - passport: set default CSRF_COOKIE_SECURE false
  • +
  • 9cc0210 (passport) - passport: canonical charts naming
  • +
  • 9ab3896 (passport) - passport: new ingress style
  • +
  • 259ccc9 (passport) - passport: provide any additional service annotations
  • +
  • af1bbcd (passport) - dockerfile: use drycc/base image
  • +
  • 9ae5373 (passport) - passport: set venv profile
  • +
  • 8f61090 (passport) - dockerfile: use uid gid
  • +
  • fcaf72d (passport) - passport: upgrade npm package
  • +
  • 546dcd5 (passport) - passport: add license
  • +
  • 4bda2d6 (passport) - passport: use minify
  • +
  • 73b0fd1 (passport) - passport: use common affinity template
  • +
  • 278fe7a (passport) - passport: change nodes to pod affinity
  • +
  • 3cd93d3 (passport) - passport: add reactive
  • +
  • 370b493 (passport) - passport: add footer
  • +
  • 483cbd6 (passport) - passport: use h_captcha replace re_captcha
  • +
  • 3d1675e (passport) - database: bump python 3.10.4 and node 16.14.2
  • +
  • 86a7835 (passport) - passport: use registry.drycc.cc replace docker.io
  • +
  • 2d65355 (passport) - passport: change python-dev registry
  • +
  • 90c1444 (passport) - passport: unified reids declaration
  • +
  • 2e0e417 (passport) - passport: fix firefox footer
  • +
  • ad274be (passport) - passport: use bulecss
  • +
  • f986d8b (passport) - passport: add main footer
  • +
  • 3e52867 (passport) - passport: dynamic settings for vue
  • +
  • 38adabc (passport) - passport: change passport config
  • +
  • f8d6b60 (passport) - passport: fine management affinity
  • +
  • 2cbd79d (passport) - passport: remove database conn_max_age
  • +
  • 7122797 (passport) - passport: change drycc.cc to www.drycc.cc
  • +
  • 8cc84cd (rabbitmq) - rabbitmq: use exec runner replace docker runner
  • +
  • f35930f (rabbitmq) - rabbitmq: add rabbitmq cluster support
  • +
  • fbfa3ba (rabbitmq) - rabbitmq: canonical charts naming
  • +
  • ca60701 (rabbitmq) - rabbitmq: use volumeClaimTemplates
  • +
  • fe5d1b4 (rabbitmq) - rabbitmq: add sharding support
  • +
  • 9c4ab97 (rabbitmq) - rabbitmq: provide any additional service annotations
  • +
  • 348a88a (rabbitmq) - dockerfile: use drycc/base image
  • +
  • 2388be1 (rabbitmq) - rabbitmq: upgrade erlang to 24.2.2
  • +
  • db2eaa5 (rabbitmq) - dockerfile: use uid gid
  • +
  • 772afd1 (rabbitmq) - rabbitmq: change to wait pid file
  • +
  • 2bfc25e (rabbitmq) - rabbitmq: use common affinity template
  • +
  • 11d505e (rabbitmq) - rabbitmq: change nodes to pod affinity
  • +
  • 69d63f1 (rabbitmq) - database: bump erlang 24.3.3 and rabbitmq 3.9.14
  • +
  • 8380299 (rabbitmq) - rabbitmq: use registry.drycc.cc replace docker.io
  • +
  • b3f69f1 (rabbitmq) - rabbitmq: add check rabbitmqLocaltion
  • +
  • 5327c76 (rabbitmq) - rabbitmq: fine management affinity
  • +
  • 5c66b5a (rabbitmq) - rabbitmq: change probe
  • +
  • 27bebf9 (rabbitmq) - rabbitmq: add start-rabbitmq script
  • +
  • 86ee6a7 (rabbitmq) - rabbitmq: upgrade to rabbitmq 3.10.7
  • +
  • 1f29683 (redis) - redis: use exec runner replace docker runner
  • +
  • a5041fc (redis) - redis: canonical charts naming
  • +
  • 64468c2 (redis) - redis: add redis persistence
  • +
  • de5d753 (redis) - redis: provide any additional service annotations
  • +
  • f644639 (redis) - dockerfile: use drycc/base image
  • +
  • 98051d2 (redis) - redis: premission denied
  • +
  • bcb548e (redis) - dockerfile: use uid gid
  • +
  • 524aa41 (redis) - redis: use common affinity template
  • +
  • 26c9466 (redis) - redis: change nodes to pod affinity
  • +
  • b67d7a2 (redis) - redis: use registry.drycc.cc replace docker.io
  • +
  • 839ec50 (redis) - redis: use env replace creds volume
  • +
  • 237ca86 (redis) - redis: fine management affinity
  • +
  • bdd968d (redis) - redis: upgrade neew require
  • +
  • 8b2910f (registry) - registry: use exec runner replace docker runner
  • +
  • eedbe78 (registry) - registry: canonical charts naming
  • +
  • 0241615 (registry) - registry: provide any additional service annotations
  • +
  • 9b58da4 (registry) - dockerfile: use drycc/base image
  • +
  • ab6acb7 (registry) - registry: change workdir to /workspace
  • +
  • f368bf7 (registry) - registry: use DRYCC_UID DRYCC_GID env
  • +
  • f4b9041 (registry) - registry: use common affinity template
  • +
  • c2e87ca (registry) - registry: change nodes to pod affinity
  • +
  • feb6aba (registry) - database: bump mc 2022.04.01.23.44.48
  • +
  • 956932b (registry) - rregistry: use registry.drycc.cc replace docker.io
  • +
  • deda8d8 (registry) - registry: move registry-secret.yaml from workflow to registry
  • +
  • f52c7bf (registry) - registry: change python-dev registry
  • +
  • 007fe03 (registry) - registry: https://github.com/minio/minio/issues/14331
  • +
  • d620c6d (registry) - registry: https://github.com/minio/minio/issues/13799
  • +
  • 85e6b73 (registry) - registry: use env replace creds volume
  • +
  • 6a1155d (registry) - registry: fine management affinity
  • +
  • 7b8ebae (registry) - registry: change minio to storage
  • +
  • 1338951 (registry) - registry: add check storage health
  • +
  • 2fa769d (registry) - registry: change probe
  • +
  • f187cbf (registry) - registry: add replicas
  • +
  • 09d8a7b (registry) - registry: upgrade to mc 2022.08.28.20.08.11
  • +
  • 4b187b8 (registry-proxy) - registry-proxy: use exec runner replace docker runner
  • +
  • 29ffbbe (registry-proxy) - registry-proxy: canonical charts naming
  • +
  • 6d783ba (registry-proxy) - registry-proxy: remove use_cni
  • +
  • 8cf05cf (registry-proxy) - dockerfile: use drycc/base image
  • +
  • 090e286 (registry-proxy) - registry-proxy: chore(imagebuilder): change uid gid to 1001
  • +
  • 7cf6120 (registry-proxy) - registry-proxy: use DRYCC_UID DRYCC_GID env
  • +
  • 3a00697 (registry-proxy) - registry-proxy: use registry.drycc.cc replace docker.io
  • +
  • 30e69e8 (registry-proxy) - registry-proxy: add registry basic auth proxy
  • +
  • 942abce (registry-proxy) - registry-proxy: upgrade to nginx 1.23.1
  • +
  • 5ea3297 (storage) - minio: use exec runner replace docker runner
  • +
  • 8306add (storage) - minio: canonical charts naming
  • +
  • c917e9f (storage) - minio: provide any additional service annotations
  • +
  • 042c732 (storage) - dockerfile: use drycc/base image
  • +
  • 7b47b82 (storage) - minio: change workdir to /workspace
  • +
  • 6f3531e (storage) - minio: use DRYCC_UID DRYCC_GID env
  • +
  • 9795fb1 (storage) - minio: use common affinity template
  • +
  • a7b09c5 (storage) - minio: change nodes to pod affinity
  • +
  • 7607342 (storage) - database: bump mc 2022.04.01.23.44.48 and minio 2022.04.01.03.41.39
  • +
  • ea2b2f1 (storage) - minio: use registry.drycc.cc replace docker.io
  • +
  • 445b501 (storage) - minio: https://github.com/minio/minio/issues/14331
  • +
  • f19fbc7 (storage) - minio: use env replace creds volume
  • +
  • 8982e2e (storage) - minio: use minio to distributed
  • +
  • 06bec73 (storage) - minio: fine management affinity
  • +
  • 9b8f006 (storage) - storage: remove assert
  • +
  • 59d64b9 (storage) - storage: change listen to POD_IP
  • +
  • 60044ee (storage) - storage: add juicefs mount options
  • +
  • 189f944 (storage) - storage: remove volumeName
  • +
  • 302fe89 (storage) - storage: mv to minio dir
  • +
  • 6ec586d (storage) - storage: change readinessProbee andlivenessProbe
  • +
  • 0e028df (storage) - storage: add minio pdb
  • +
  • cf9bd2d (storage) - storage: add check storage health svc
  • +
  • 2dd5c9f (storage) - storage: add volumeBindingMode
  • +
  • fa2effc (storage) - storage: remove databaseBucket
  • +
  • d166cc7 (storage) - charts: format network-policy name
  • +
  • d06bcce (storage) - storage: upgrade to golang 1.19
  • +
  • c2ca05c (storage) - storage: upgrade new require
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.5.0

+
New Drycc Workflow Release v1.5.0
+ +

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.

+

Workflow ## v1.4.0 -> v1.5.0

+

Releases

+
    +
  • passport v1.0.0
  • +
  • rabbitmq v1.0.0
  • +
  • imagebuilder v1.0.0
  • +
  • builder v1.2.0 -> v1.3.0
  • +
  • controller v1.3.0 -> v1.4.0
  • +
  • database v1.0.2 -> v1.1.0
  • +
  • fluentd v1.1.0 -> v1.2.0
  • +
  • redis v1.1.0 -> v1.2.0
  • +
  • influxdb v1.0.1 -> v1.1.0
  • +
  • logger v1.1.0 -> v1.2.0
  • +
  • minio v1.1.0 -> v1.2.0
  • +
  • monitor v1.1.0 -> v1.2.0
  • +
  • nsqd v1.1.0 -> v1.2.0
  • +
  • registry v1.0.3 -> v1.1.0
  • +
  • registry-proxy v1.0.2 -> v1.1.0
  • +
+

Features

+
    +
  • 0f5f8e4 (builder) - builder: multi-platform support
  • +
  • f269d06 (builder) - build: add buildx supportjkjkk:q
  • +
  • 5e72fe8 (builder) - registry: use docker build
  • +
  • 25d8a4c (builder) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 7a3e1c5 (builder) - charts: set the default chart version
  • +
  • 46b75ff (builder) - builder: add cloud native buildpacks support
  • +
  • 2db2054 (builder) - builder: unified build model
  • +
  • 4b7f9d9 (builder) - builder: add initContainers
  • +
  • b78c936 (controller) - token: add get token api
  • +
  • bac52a5 (controller) - tasks: use celery replace nsqd
  • +
  • b9b0c58 (controller) - build: add buildx support
  • +
  • 205dcb3 (controller) - influxdb: add influxdb client
  • +
  • ff15849 (controller) - influxdb: upgrade to influxdb 2.x
  • +
  • 4016244 (controller) - controller: push data to influx
  • +
  • fcfce2e (controller) - workflow-manager: add workflow-manager support
  • +
  • 00e9bfb (controller) - influxdb: review influxdb code
  • +
  • dd644d5 (controller) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 118278b (controller) - charts: set the default chart version
  • +
  • 122a9cd (controller) - oauth2: add oauth2 support
  • +
  • 559a5b6 (controller) - controller: use cncf buildpacks replace slugrunner
  • +
  • 96130e6 (controller) - charts: database configuration optimization of passport and controller
  • +
  • 2ea8508 (controller) - oauth: using passport authentication
  • +
  • 868c437 (database) - database: multi-platform support
  • +
  • eadd5da (database) - build: add buildx support
  • +
  • b6eea4c (database) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 04a88db (database) - charts: set the default chart version
  • +
  • 92ed309 (database) - database: add initContainer
  • +
  • ee6b78f (fluentd) - build: add buildx support
  • +
  • f523e30 (fluentd) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • ee47b53 (fluentd) - charts: set the default chart version
  • +
  • 80a51af (influxdb) - influxdb: modify influxdb naming rules
  • +
  • fb10030 (influxdb) - influxdb: use influxdb v2
  • +
  • 0e87ad8 (influxdb) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 9d10801 (influxdb) - charts: set the default chart version
  • +
  • d825c9f (logger) - build: add buildx support
  • +
  • b139576 (logger) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 88f84ea (logger) - charts: set the default chart version
  • +
  • 5ccae3e (logger) - dockerfile: remove chmod cmd
  • +
  • 193aefc (logger) - logger: add initContainers
  • +
  • baee330 (minio) - minio: multi-platform support
  • +
  • ad5d055 (minio) - build: add buildx support
  • +
  • 19868d4 (minio) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 4bd84b8 (minio) - charts: set the default chart version
  • +
  • 79d1f2f (monitor) - database: multi-platform support
  • +
  • 88e5a7f (monitor) - build: add buildx support
  • +
  • 5672e99 (monitor) - influxdb: modify influxdb naming rules
  • +
  • 8672103 (monitor) - influxdb: use influxdb v2
  • +
  • 66cb4c8 (monitor) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 9576eb3 (monitor) - charts: set the default chart version
  • +
  • 30809c9 (monitor) - monitor: add initContainers
  • +
  • 70d140c (nsqd) - nsqd: using self compiled nsq binary
  • +
  • 1073d4f (nsqd) - nsqd: use GOPATH replace /go
  • +
  • e498480 (nsqd) - build: add buildx support
  • +
  • cf9b7d5 (nsqd) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • c335856 (nsqd) - charts: set the default chart version
  • +
  • efba713 (redis) - build: add buildx support
  • +
  • c7a3b53 (redis) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 4cdad7b (redis) - charts: set the default chart version
  • +
  • 652b443 (registry) - registry: multi-platform support
  • +
  • 4060176 (registry) - registry: use docker build
  • +
  • 7102a03 (registry) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 6c8600d (registry) - charts: set the default chart version
  • +
  • 33a51c9 (registry) - registry: add initContainers
  • +
  • bef70dc (registry-proxy) - build: add buildx support
  • +
  • d2319c1 (registry-proxy) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 02fafed (registry-proxy) - charts: set the default chart version
  • +
+

Fixes

+
    +
  • 5499c9a (controller) - gunicorn: gunicorn not running
  • +
  • 06e9e88 (controller) - controller: error loading shared library
  • +
  • 01b5bd0 (controller) - controller: upgrade celery config
  • +
  • 6e32d55 (controller) - controller: fix update resources bug
  • +
  • 0e0d53f (controller) - chart: set the domain depends certManagerEnabled
  • +
  • 2ac4ca8 (controller) - passport: error loading shared library libexpat.so.1
  • +
  • a0dd517 (fluentd) - fluentd: drone build
  • +
  • 6eca2a3 (logger) - logger: golang lint
  • +
  • 63b0aa0 (registry) - drone: charts url error
  • +
+

Docs

+
    +
  • 472cfcc (controller) - controller organize README.md document
  • +
  • d9d6e29 (redis) - redis: delete links that do not exist
  • +
+

Test case

+
    +
  • 1468f57 (controller) - controller: add command unittest
  • +
+

Maintenance

+
    +
  • 9999bfd (builder) - builder:replace the special words
  • +
  • cda8b58 (builder) - builder: remove docker keyword from charts
  • +
  • dc575dd (builder) - builder: use imagebuilder replace dockerbuilder
  • +
  • d3bb183 (builder) - docker: use the full name of registry
  • +
  • 5fe34d1 (builder) - travis: add DEV_REGISTRY
  • +
  • 7e36453 (builder) - CICD: use drone
  • +
  • 52b8d9d (builder) - drone: add image_registries volumes
  • +
  • 65963f4 (builder) - k8s: add privileged to dind
  • +
  • d345fcf (builder) - LICENSE: revert modifications to Apache license
  • +
  • 7975c99 (builder) - drone: always pull image
  • +
  • 59633dd (builder) - builder: modify launch imagebuild pod
  • +
  • 8d14e67 (builder) - builder: use Procfile in anywhere
  • +
  • 5357fa8 (builder) - go: bump go mod
  • +
  • 8d26ac0 (builder) - k8s: k8s deprecated api migration
  • +
  • 0af620d (builder) - chars: change org to imageTag
  • +
  • ae84303 (builder) - builder: run imagebuider replace pod with job
  • +
  • 3b2c496 (builder) - builder: change docs website
  • +
  • 5679a4c (builder) - builder: upgrade to golang1.17
  • +
  • a214503 (controller) - controller:replace whitelist with allowlist
  • +
  • 375ddcc (controller) - ps:drycc ps:list show autoscale num
  • +
  • c32e409 (controller) - ldap: canot register when ldap is enabled
  • +
  • c46580a (controller) - controller:modify redis config
  • +
  • fa9e87b (controller) - chart:modify controller charts
  • +
  • 6f9fd08 (controller) - nsq: remove nsq
  • +
  • 994b2dc (controller) - docker-buildx: add check-docker
  • +
  • a720c3a (controller) - controller: remove docker keyword from charts
  • +
  • e9a5c84 (controller) - docker: use the full name of registry
  • +
  • a26614a (controller) - controller: add rabbitmq env
  • +
  • 3df229d (controller) - controller: modify database config && remove redis port config && add env prefix with DRYCC
  • +
  • 257e94b (controller) - controller: CELERY_BROKER use rabbitmq and modify celery-deployment cronjob
  • +
  • f4d6ec3 (controller) - chart: pretty chart format
  • +
  • 63e6195 (controller) - influxdb: modify influxdb code
  • +
  • 0f6d408 (controller) - CICD: use drone
  • +
  • 87bad28 (controller) - python: upgrade to python3.9
  • +
  • e8f7560 (controller) - volumes: modify mount summary
  • +
  • 6cf6c6b (controller) - drone: add image_registries volumes
  • +
  • a9397e8 (controller) - oauth: modify token Authentication
  • +
  • c7f8c8b (controller) - deps: bump django from 2.2.14 to 2.2.18 in /rootfs
  • +
  • a1a08aa (controller) - deps: bump djangorestframework from 3.11.0 to 3.11.2 in /rootfs
  • +
  • efd78b4 (controller) - deps: bump django from 2.2.18 to 2.2.20 in /rootfs
  • +
  • 649b044 (controller) - deps: bump django from 2.2.20 to 2.2.22 in /rootfs
  • +
  • 41b742b (controller) - deps: bump django from 2.2.22 to 2.2.24 in /rootfs
  • +
  • 22ffe5d (controller) - LICENSE: revert modifications to Apache license
  • +
  • c98b468 (controller) - drone: always pull image
  • +
  • 20e6edb (controller) - chart: modify the problem of using buildpack
  • +
  • db16879 (controller) - controller: pretty pods list print
  • +
  • ba6f456 (controller) - test: pretty pods list print
  • +
  • 5fce4b7 (controller) - k8s: k8s deprecated api migration
  • +
  • e9e0bcb (controller) - oauth: using passport authentication
  • +
  • 0311172 (controller) - chars: change org to imageTag
  • +
  • 150eff1 (controller) - charts: update cert-manager api version
  • +
  • de8545a (controller) - controller: update requirements
  • +
  • 1442207 (controller) - controller: using django native JSONFiled
  • +
  • ab4e836 (controller) - oauth: modify passport api
  • +
  • 5c54e06 (controller) - controller: eliminate pip warnings
  • +
  • 870328d (controller) - controller: remove entrypoint
  • +
  • 5e5e6ae (controller) - controller: upgrade celery config
  • +
  • 607778f (controller) - controller: add initContainer
  • +
  • 23dc016 (controller) - chart: set the domain depends certManagerEnabled
  • +
  • f3cf20b (controller) - controller: remove default bash env
  • +
  • 73f2636 (controller) - controller: modify alpinelinux repositories
  • +
  • 498e9f2 (controller) - chart: change certManagerEnabled to boolean type
  • +
  • 27f5308 (controller) - passport: exclude cryptography
  • +
  • 370b75d (controller) - controller: use sh env
  • +
  • 07585b4 (database) - postgres:replace the special words
  • +
  • 20172dc (database) - database: remove docker keyword from charts
  • +
  • abb9b88 (database) - docker: use the full name of registry
  • +
  • e72f58f (database) - chart: modify the off-cluster database
  • +
  • a91f64f (database) - travis: add DEV_REGISTRY
  • +
  • 614fb76 (database) - tests: use add-host replace link
  • +
  • a3428f3 (database) - CICD: use drone
  • +
  • 239fef1 (database) - drone: add image_registries volumes
  • +
  • 42858e1 (database) - LICENSE: revert modifications to Apache license
  • +
  • d0fe850 (database) - drone: always pull image
  • +
  • 34a36ad (database) - charts: Nn secret is generated during off-cluster
  • +
  • 064ccf4 (database) - database: create database
  • +
  • 9228992 (database) - chars: change org to imageTag
  • +
  • 9f7810c (database) - database: upgrade to wal-g v1.1
  • +
  • 05783f4 (fluentd) - fluentd:replace the special words
  • +
  • 0739809 (fluentd) - influxdb:replace monitor-influx with influx
  • +
  • f02487c (fluentd) - fluentd: remove docker keyword from charts
  • +
  • 2c96cc0 (fluentd) - docker: use the full name of registry
  • +
  • b20c429 (fluentd) - charts: remove port config
  • +
  • 6dd0197 (fluentd) - travis: add DEV_REGISTRY
  • +
  • c5bec51 (fluentd) - CICD: use drone
  • +
  • f8524b7 (fluentd) - drone: add image_registries volumes
  • +
  • a50878a (fluentd) - LICENSE: revert modifications to Apache license
  • +
  • 14fe20e (fluentd) - drone: always pull image
  • +
  • 4a2f660 (fluentd) - k8s: k8s deprecated api migration
  • +
  • de2dd91 (fluentd) - chars: change org to imageTag
  • +
  • a9f1944 (fluentd) - fluentd: upgrade to fluentd1.14
  • +
  • 7cb4e95 (influxdb) - influxdb: change username to user
  • +
  • 0fdc21b (influxdb) - influxdb: remove docker keyword from charts
  • +
  • b2acddb (influxdb) - influxdb: change default path
  • +
  • ba88919 (influxdb) - influxdb: add check_env function
  • +
  • 9117401 (influxdb) - influxdb: modify init_influxdb has_bucket
  • +
  • 092a3e6 (influxdb) - chart: pod not readiness
  • +
  • 51de380 (influxdb) - travis: add DEV_REGISTRY
  • +
  • 66d7667 (influxdb) - docker: replace influxdb base image
  • +
  • 3aa3094 (influxdb) - CICD: use drone
  • +
  • 14b9c24 (influxdb) - drone: add image_registries volumes
  • +
  • 02b4cd1 (logger) - logger:replace the special words
  • +
  • 114b5d5 (logger) - reids: delete the logger prefix of redis
  • +
  • 639278a (logger) - redis: remove logger from redis conf
  • +
  • 90195e2 (logger) - go: remove GOOS and GOARCH
  • +
  • 31e2e27 (logger) - logger: remove docker keyword from charts
  • +
  • 8fbd9fa (logger) - docker: use the full name of registry
  • +
  • b39df2d (logger) - charts: remove redis\nsqd port config
  • +
  • 35d6d07 (logger) - travis: add DEV_REGISTRY
  • +
  • 69aabf5 (logger) - tests: remove docker link
  • +
  • e916644 (logger) - CICD: use drone
  • +
  • d6872b7 (logger) - drone: add image_registries volumes
  • +
  • 37801da (logger) - LICENSE: revert modifications to Apache license
  • +
  • cfb4b38 (logger) - drone: always pull image
  • +
  • 8bda3bf (logger) - go: bump go mod
  • +
  • e13ebfc (logger) - chars: change org to imageTag
  • +
  • 38e6d8d (minio) - minio:replace the special words
  • +
  • d6925dd (minio) - minio: remove docker keyword from charts
  • +
  • d56bc39 (minio) - docker: use the full name of registry
  • +
  • e4696cc (minio) - travis: add DEV_REGISTRY
  • +
  • 70c5c79 (minio) - minio: use latest version
  • +
  • 773cf6c (minio) - Makefile: remove DEV_REGISTRY ?=
  • +
  • 5ce5bc6 (minio) - CICD: use drone
  • +
  • 5da8be3 (minio) - drone: add image_registries volumes
  • +
  • c1f0611 (minio) - LICENSE: revert modifications to Apache license
  • +
  • b73f792 (minio) - drone: always pull image
  • +
  • 79d1c93 (minio) - go: bump go mod
  • +
  • c448899 (minio) - chars: change org to imageTag
  • +
  • 15ee49e (minio) - minio: migrate deprecated warning
  • +
  • 9968a1a (minio) - minio: upgrade to golang1.7
  • +
  • 14fedd2 (monitor) - monitor:replace the special works
  • +
  • 52c431a (monitor) - reids: delete the logger prefix of redis
  • +
  • 2c95b47 (monitor) - redis: remove logger from redis conf
  • +
  • da9bc56 (monitor) - monitor:remove influxdb
  • +
  • 53f47b9 (monitor) - grafana: use grafana docker image
  • +
  • 5bdb188 (monitor) - grafana: use grafana docker image
  • +
  • c0586dd (monitor) - monitor: remove docker keyword from charts
  • +
  • 87d02b6 (monitor) - charts: add nodes and persistentvolumes rule
  • +
  • 1b5598f (monitor) - monitor: modify grafana dashboard with FLUX and pretty config.toml
  • +
  • bcbc0d5 (monitor) - docker: use the full name of registry
  • +
  • 9418c9e (monitor) - monitor: fix upload dashboard error and modify INFLUXDB input
  • +
  • 589f29a (monitor) - travis: add DEV_REGISTRY
  • +
  • f776f8a (monitor) - CICD: use drone
  • +
  • 6ca3060 (monitor) - drone: add image_registries volumes
  • +
  • 6a9ffb2 (monitor) - LICENSE: revert modifications to Apache license
  • +
  • 45e41ed (monitor) - drone: always pull image
  • +
  • 654d407 (monitor) - k8s: k8s deprecated api migration
  • +
  • 41e9b9c (monitor) - chars: change org to imageTag
  • +
  • 99c10d3 (monitor) - charts: update cert-manager api version
  • +
  • 9bf83c4 (monitor) - oauth: user oauth passport
  • +
  • a128f6d (monitor) - chart: change certManagerEnabled to boolean type
  • +
  • 8f897fe (monitor) - chart: set the domain depends certManagerEnabled
  • +
  • ba6d793 (nsqd) - README:update travis build status
  • +
  • 49879c4 (nsqd) - nsqd: minimum git clone code
  • +
  • c5e2680 (nsqd) - nsqd: remove docker keyword from charts
  • +
  • 21dd17b (nsqd) - docker: use the full name of registry
  • +
  • 7d86b3c (nsqd) - charts: remove port config
  • +
  • c073d95 (nsqd) - travis: add DEV_REGISTRY
  • +
  • 55c297c (nsqd) - CICD: use drone
  • +
  • 165c2ae (nsqd) - drone: add image_registries volumes
  • +
  • 9c6a1f8 (nsqd) - LICENSE: revert modifications to Apache license
  • +
  • 9283098 (nsqd) - drone: always pull image
  • +
  • 46acf8a (nsqd) - k8s: k8s deprecated api migration
  • +
  • 43caf80 (nsqd) - chars: change org to imageTag
  • +
  • 6897471 (nsqd) - nsqd: use official image
  • +
  • 297bc05 (redis) - redis:replace the special words
  • +
  • f5f8b5e (redis) - reids: delete the logger prefix of redis
  • +
  • af7b657 (redis) - redis: change logger-redis to redis
  • +
  • 8dca154 (redis) - redis: remove logger from redis conf
  • +
  • eaeda2d (redis) - redis: remove docker keyword from charts
  • +
  • 53c6358 (redis) - docker: use the full name of registry
  • +
  • ae37416 (redis) - charts: remove port config
  • +
  • e985656 (redis) - travis: add DEV_REGISTRY
  • +
  • 423336a (redis) - CICD: use drone
  • +
  • be64ab4 (redis) - drone: add image_registries volumes
  • +
  • 3bec735 (redis) - LICENSE: revert modifications to Apache license
  • +
  • 4f934f6 (redis) - drone: always pull image
  • +
  • 359b878 (redis) - chars: change org to imageTag
  • +
  • 83b8ac2 (registry) - workflow:replace the special words
  • +
  • 869b280 (registry) - registry: remove docker keyword from charts
  • +
  • 999c1e9 (registry) - docker: use the full name of registry
  • +
  • 5652da9 (registry) - travis: add DEV_REGISTRY
  • +
  • cc8c6c2 (registry) - CICD: use drone
  • +
  • c7bdbd0 (registry) - CICD: pretty .drone.yaml format
  • +
  • 5c55a38 (registry) - test: use add-host replace link
  • +
  • f8866f3 (registry) - drone: add image_registries volumes
  • +
  • 6c8292f (registry) - LICENSE: revert modifications to Apache license
  • +
  • 1d50f2c (registry) - drone: always pull image
  • +
  • efbca6d (registry) - chars: change org to imageTag
  • +
  • 2eafc59 (registry-proxy) - registry-proxy: update nginx
  • +
  • 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions
  • +
  • c72db96 (registry-proxy) - registry-proxy: change travis icon url
  • +
  • 63ffb92 (registry-proxy) - registry-proxy:replace the special works
  • +
  • 1d904a6 (registry-proxy) - registry-proxy: remove docker keyword from charts
  • +
  • c8200b1 (registry-proxy) - docker: use the full name of registry
  • +
  • d3fa939 (registry-proxy) - travis: add DEV_REGISTRY
  • +
  • 5a8b353 (registry-proxy) - CICD: use drone
  • +
  • 703d05a (registry-proxy) - drone: add image_registries volumes
  • +
  • aa71db1 (registry-proxy) - LICENSE: revert modifications to Apache license
  • +
  • 710c126 (registry-proxy) - drone: always pull image
  • +
  • 2dcc5e6 (registry-proxy) - chars: change org to imageTag
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.4.0

+
New Drycc Workflow Release v1.4.0
+ +

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.

+

Workflow ## v1.3.0 -> v1.4.0

+

Releases

+
    +
  • builder v1.1.0 -> v1.2.0
  • +
  • slugbuilder v1.1.1 -> v1.2.0
  • +
  • dockerbuilder v1.1.1 -> v1.1.2
  • +
  • controller v1.2.1 -> v1.3.0
  • +
  • slugrunner v1.1.1 -> v1.1.2
  • +
  • database v1.0.1 -> v1.0.2
  • +
  • fluentd v1.0.1 -> v1.1.0
  • +
  • redis v1.0.0 -> v1.1.0
  • +
  • logger v1.0.0 -> v1.1.0
  • +
  • minio v1.0.1 -> v1.1.0
  • +
  • monitor v1.0.1 -> v1.1.0
  • +
  • nsqd v1.0.0 -> v1.1.0
  • +
  • registry v1.0.2 -> v1.0.3
  • +
  • registry-proxy v1.0.0 -> v1.0.1
  • +
+

Features

+
    +
  • fc7d93f (builder) - builder: use go-dev
  • +
  • 0c2159e (builder) - builder: fmt code and add create_bucket script
  • +
  • 1b88340 (controller) - controller: remove deprecated api
  • +
  • a92fdeb (controller) - routable: ingress support routable
  • +
  • 1e3eab3 (controller) - maintenance: add maintenance support for ingress
  • +
  • 56b9dd0 (controller) - crt: support containerd-ctr
  • +
  • 5fc3b46 (controller) - controller: add ephemeral-storage restriction
  • +
  • d677e52 (controller) - controller: add a volume command
  • +
  • 5f1323a (controller) - controller:drycc run cmd add –mount para
  • +
  • 74c36a5 (controller) - tasks: add distributed async task
  • +
  • 139c3ca (controller) - tasks: change nsq reader to async
  • +
  • f237d74 (controller) - controller:add drycc resource cmd
  • +
  • 41b46d0 (controller) - controller:add drycc resource cmd improvement
  • +
  • c26f7d8 (controller) - controller: add LimitRanges support
  • +
  • 45b5d1b (controller) - users: add users status api
  • +
  • 4e16f9b (controller) - ps:add ps:stop/start command
  • +
  • c659fa9 (controller) - k8s: add k8s cluster domain
  • +
  • 31a625d (controller) - ps:add ps:stop/start command
  • +
  • 00a779a (fluentd) - fluentd: support containerd log format
  • +
  • f3f1bd4 (fluentd) - nsqd: add stateless nsqd cluster support
  • +
  • db7147c (fluentd) - mirrors: delete aliyun mirrors
  • +
  • 689c12e (logger) - nsqd: add stateless nsqd cluster support
  • +
  • 78ccc5d (logger) - redis: add redis client cluster support
  • +
  • 9843f2c (logger) - k8s: add k8s cluster domain
  • +
  • 6ba122e (minio) - minio: add pvc support
  • +
  • 6973550 (monitor) - monitor: add ingress for monitor
  • +
  • cd73305 (monitor) - charts: add volumeName support
  • +
  • 4769fe9 (monitor) - nsqd: add stateless nsqd cluster support
  • +
  • 87806df (monitor) - k8s: add k8s cluster domain
  • +
  • 4db40c4 (nsqd) - nsqd: add stateless nsqd cluster support
  • +
  • b6f3d4f (nsqd) - nsqd: add stateless nsqd cluster support
  • +
  • 74b85bb (redis) - redis: change redis to statefulset
  • +
  • ff98b50 (slugbuilder) - slugbuilder: delete build hook
  • +
  • b201c2f (slugbuilder) - buildpacks: use drycc buildpacks
  • +
+

Fixes

+
    +
  • 0ec042d (builder) - test: fix test case error
  • +
  • 4fb113b (builder) - build: base image replace by alpine
  • +
  • 443df48 (builder) - minio: fix not bucket error
  • +
  • 3dab5b0 (builder) - minio: create bucket error
  • +
  • 734fca6 (controller) - autoscale: Fix for autoscale on k8s-1.9+ without breaking manual scaling
  • +
  • a7dcd10 (controller) - controller: test pass
  • +
  • 93f0f2e (controller) - controller: fix migrations error
  • +
  • 4724375 (controller) - controller: fix test error
  • +
  • 7bacf29 (controller) - charts: fix clusterrole
  • +
  • 90957f7 (controller) - pod: sort events error
  • +
  • 440b13e (controller) - controller: review table structure
  • +
  • 0a470a6 (controller) - controller: bump tornado 5.1.1
  • +
  • e39218b (controller) - pynsq: no current event loop in thread
  • +
  • 1d8630e (controller) - tests: fix test_task.py run error
  • +
  • 1ff1202 (controller) - controller: fix test case
  • +
  • d8c0da3 (controller) - settings: fix env name
  • +
  • 6d8fd36 (database) - 003_restore_from_backup.sh: ignore script exit 1
  • +
  • e0394a9 (database) - minio: fix not bucket error
  • +
  • f35f252 (database) - mc: fix create_bucket error
  • +
  • 74d6886 (database) - postgres: recovery mode not run
  • +
  • e50d0c1 (dockerbuilder) - caddy: fix caddy not start
  • +
  • f3bec7a (fluentd) - influxdb: fix influxdb host and port
  • +
  • bc19f27 (fluentd) - charts: skipped value for daemon_environment: Not a table
  • +
  • 338d623 (logger) - logger: logger not run in alpine
  • +
  • 7788302 (minio) - minio: bump minio version
  • +
  • 619eed0 (minio) - fix: use go mod replace dep
  • +
  • 3b42122 (monitor) - monitor: fix host error
  • +
  • 67998ef (monitor) - influxdb: replace drycc-monitor-influxapi to drycc-monitor-influx-api
  • +
  • 2cc361c (registry) - registry: fix test case
  • +
  • 548297a (registry) - minio: fix not bucket error
  • +
  • 5412ddb (registry) - minio: create bucket error
  • +
  • d0d629e (slugbuilder) - slugbuilder:fix normalize_storage path
  • +
  • d76ecbe (slugbuilder) - slugbuilder: use v3 api
  • +
  • c505e18 (slugbuilder) - shellcheck: SC2039
  • +
+

Style

+
    +
  • c893a17 (builder) - builder: fmt code
  • +
  • bba5795 (controller) - controller: format code
  • +
  • d36082b (controller) - controller: fix pep8
  • +
  • 66026f2 (controller) - resource: standardize the naming of resource
  • +
  • 03d7e2c (controller) - servicecatalog: change servicecatalog to svcat
  • +
  • 49dbb6d (controller) - controller: flake8 upgrade
  • +
  • cbfc108 (monitor) - monitor: format charts and dashboard
  • +
  • ee85954 (slugbuilder) - slugbuilder: use shellcheck
  • +
  • 3afed2e (slugbuilder) - docker: simplify dockerfile
  • +
  • 36b7f68 (slugrunner) - docker: simplify dockerfile
  • +
+

Maintenance

+
    +
  • 61bb0ef (builder) - aws: upgrade aws sdk version
  • +
  • 0f2e074 (builder) - chore: use go mode replace dep
  • +
  • e9a2219 (builder) - builder: delete glide up
  • +
  • bb8c518 (builder) - registry: del quay.io
  • +
  • fa6d02f (builder) - builder: upgrade go.sum
  • +
  • 9d61e8d (builder) - build: upgrade go.mod
  • +
  • d763a98 (builder) - charts: upgrade k8s newer API versions
  • +
  • d1bc1aa (builder) - pkg: upgrade to new drycc/pkg
  • +
  • 02b1e98 (builder) - builder: update go mod
  • +
  • 8e17d65 (builder) - builder: change alpine repositories
  • +
  • f32b723 (builder) - mirrors: delete aliyun mirrors
  • +
  • e33dc61 (builder) - minio: use bin mc replace docker images
  • +
  • 3ab4f1c (builder) - builder: update controller-sdk-go
  • +
  • b2adfac (builder) - heroku: remove heroku-16 support
  • +
  • f429ac8 (builder) - builder: set GIT_LOCK_TIMEOUT to 30 minutes
  • +
  • 7197c83 (builder) - go.mod:upgrade require pkg controller-sdk-go
  • +
  • 5f3e22d (controller) - deps: bump django from 1.11.21 to 1.11.22 in /rootfs
  • +
  • 1db645a (controller) - deps: bump django from 1.11.22 to 1.11.23 in /rootfs
  • +
  • fbe8067 (controller) - deps: bump django from 1.11.23 to 1.11.29 in /rootfs
  • +
  • 537d667 (controller) - registry: del quay.io
  • +
  • a23c65b (controller) - deps: update all deps to the latest version
  • +
  • 546337e (controller) - charts: upgrade k8s newer API versions
  • +
  • 06023f8 (controller) - workflow-manager: del workflow-manager
  • +
  • bba5736 (controller) - controller: change cluster-issuer location
  • +
  • 6c43661 (controller) - Certificatechange cluster-issuer location
  • +
  • 39a4728 (controller) - controller:change cluster-issuer location del controller-cluster-issuer.yaml
  • +
  • 9e96d3f (controller) - Certificate:upgrade version cert-manager.io/v1alpha2
  • +
  • 8e68049 (controller) - docker: use INDEX_URL replace index.docker.io
  • +
  • 8fda205 (controller) - cert_manager: change cert_manager_enabled to global
  • +
  • 6fefb6d (controller) - charts: change platform_domain to global
  • +
  • 064b2ad (controller) - maintenance: remove maintenance support
  • +
  • b8797c9 (controller) - workflow: remove namespace
  • +
  • 1b20d76 (controller) - quota: add kube quota config
  • +
  • d780075 (controller) - pod: add pod default resources support
  • +
  • 3d72c08 (controller) - rename: rename ingress name
  • +
  • 0aa6ab9 (controller) - mirrors: delete aliyun mirrors
  • +
  • 7533a65 (controller) - heroku: remove heroku-16 support
  • +
  • e5a885d (controller) - controller:check mount volume path
  • +
  • 9014e74 (controller) - test: optimization Dockerfile.test
  • +
  • 0b6ebb2 (controller) - tasks: change apply_async parameters
  • +
  • 835f009 (controller) - wsgi: add tornado 6 support
  • +
  • 67a4ad7 (controller) - utils: use threads replace asyncio
  • +
  • a28949b (controller) - ldap: add AUTH_LDAP_USER_FLAGS_BY_GROUP
  • +
  • a903209 (controller) - charts: add custom controller environment variables support
  • +
  • e0e783e (controller) - ldap: change filter style
  • +
  • d760825 (controller) - scheduler: remove debug log
  • +
  • a25928e (controller) - wsgi: remove a wsgi.py file
  • +
  • 7b2696e (controller) - log: disable nsq.client info log
  • +
  • 8d5c07b (controller) - charts: add default environment
  • +
  • 025f4a2 (controller) - controller: change quota name
  • +
  • ebda60e (controller) - controller: review pvc code
  • +
  • 8832ba9 (controller) - controller: change status\binding model type and mount path check container_types
  • +
  • 7148d04 (controller) - controller: add overcommit cpu and ram support
  • +
  • 4d2087c (controller) - limits: modify limits unit verification
  • +
  • af36970 (controller) - api: check cpu/memory range for api
  • +
  • 329355b (controller) - volumes: modify the volume size
  • +
  • 9dfee09 (controller) - LimitRanges: modify the default limits
  • +
  • 5205bca (controller) - controller: improve the details of certificate
  • +
  • 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • 6415e2c (database) - postgres: upgrade to pg13
  • +
  • 12e6806 (database) - charts: upgrade k8s newer API versions
  • +
  • d294509 (database) - minio: use canary minio test
  • +
  • 1bad02e (database) - mirrors: delete aliyun mirrors
  • +
  • d51420b (database) - minio: use bin mc replace docker images
  • +
  • 4133d05 (dockerbuilder) - dockerbuilder: update caddy and kaniko
  • +
  • 6b4dd18 (dockerbuilder) - minio: use bin mc replace docker images
  • +
  • 6df9b7c (fluentd) - deps-dev: update rake requirement from ~> 10.0 to ~> 12.3
  • +
  • c2490f8 (fluentd) - fluentd: upgrade fluentd
  • +
  • be4a56a (fluentd) - fluentd: add Gemfile.lock
  • +
  • 2237f75 (fluentd) - charts: upgrade k8s newer API versions
  • +
  • c574065 (fluentd) - charts: upgrade k8s newer API versions
  • +
  • 52b8084 (fluentd) - router: delete obsolete router code
  • +
  • 3b3cceb (fluentd) - fluentd: remove manifests dir
  • +
  • 25c6702 (fluentd) - nsqd: change var name
  • +
  • bd571be (fluentd) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS
  • +
  • 72aa4e6 (fluentd) - influxdb: change influxdb service name
  • +
  • bd61903 (logger) - logger: use go mod replace dep
  • +
  • 69c63a1 (logger) - logger: update go.mod
  • +
  • 3aa9cd7 (logger) - registry: del quay.io
  • +
  • f058496 (logger) - nsqd: change var name
  • +
  • 6d9787c (logger) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS
  • +
  • 85ed307 (logger) - logger: standard naming
  • +
  • d88e7b6 (minio) - minio: update minio api to v7
  • +
  • 43715d2 (minio) - minio: upgrade minio
  • +
  • 0e1239b (minio) - minio: use docker.io replace quay.io
  • +
  • f7f047b (minio) - registry: del quay.io
  • +
  • afa7128 (minio) - build: upgrade go.mod
  • +
  • aff2db5 (minio) - charts: upgrade k8s newer API versions
  • +
  • 4547f14 (minio) - pkg: upgrade to new drycc/pkg
  • +
  • 2769b85 (minio) - minio: use bin mc replace docker images
  • +
  • 35dde8d (monitor) - monitor: update grafana influxdb telegraf
  • +
  • 9e3a949 (monitor) - charts: upgrade k8s newer API versions
  • +
  • 6af0432 (monitor) - workflow-manager: remove workflow-manager
  • +
  • 0611c07 (monitor) - router: delete obsolete router code
  • +
  • be04824 (monitor) - cert_manager: change cert_manager_enabled to global
  • +
  • 3780165 (monitor) - charts: change platform_domain to global
  • +
  • 50b04e1 (monitor) - influxdb: remove influxdb admin ui
  • +
  • 6ab4d68 (monitor) - influxdb: remove unuse port
  • +
  • f1510bd (monitor) - monitor: update grafana dashboard,telegraf inputs.kubernetes
  • +
  • f36de2c (monitor) - pvc: upgrade to new format
  • +
  • fc78a0a (monitor) - workflow: remove namespace
  • +
  • e85890f (monitor) - monitor: monitoring nsqd and redis separately
  • +
  • 694f6b1 (monitor) - mirrors: delete aliyun mirrors
  • +
  • 4aea36a (monitor) - grafana: add ldap support for grafana
  • +
  • 68fc30f (nsqd) - nsq: update nsq
  • +
  • 16f32aa (nsqd) - charts: upgrade k8s newer API versions
  • +
  • 04db389 (redis) - reids: update to redis 6
  • +
  • 3f01bab (redis) - charts: upgrade k8s newer API versions
  • +
  • 647e4be (registry) - registry: del quay.io
  • +
  • 0bbce99 (registry) - charts: upgrade k8s newer API versions
  • +
  • a982b50 (registry) - minio: use bin mc replace docker images
  • +
  • e088da3 (registry-proxy) - ingress: renmae use_native_ingress to use_ingress
  • +
  • 7e88337 (registry-proxy) - nginx: upgrade nginx to mainline
  • +
  • 7204d72 (registry-proxy) - registry: optimizing variable naming
  • +
  • 2eafc59 (registry-proxy) - registry-proxy: update nginx
  • +
  • 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions
  • +
  • c72db96 (registry-proxy) - registry-proxy: change travis icon url
  • +
  • ca9f962 (slugbuilder) - slugbuilder: del BUILDPACK_URL support
  • +
  • 1b74dd5 (slugbuilder) - slugbuilder: add heroku-20 support
  • +
  • 54d4ad2 (slugbuilder) - slugbuilder: del quay.io
  • +
  • a78f37e (slugbuilder) - slugbuilder: add heroku-20 stack
  • +
  • 94ac94a (slugbuilder) - minio: use bin mc replace docker images
  • +
  • 53b4b8b (slugbuilder) - slugbuilder: modify stack priority
  • +
  • 58e2bd2 (slugbuilder) - dockerfile: add WORKDIR /tmp
  • +
  • b29cd04 (slugbuilder) - slugbuilder: add pre_build.sh
  • +
  • 9d319f6 (slugbuilder) - slugbuilder: silent mc command output
  • +
  • d1ec3c9 (slugbuilder) - heroku: remove heroku-16 support
  • +
  • 5048534 (slugbuilder) - slugbuilder: use drycc stack-images
  • +
  • a116537 (slugrunner) - slugrunner: add heroku-20 support
  • +
  • a1196bf (slugrunner) - slugrunner: del quay.io
  • +
  • 64c96d7 (slugrunner) - slugrunner: add heroku-20 stack
  • +
  • cc3e226 (slugrunner) - minio: use bin mc replace docker images
  • +
  • 9130bde (slugrunner) - shellcheck: shellcheck installer
  • +
  • 4ea33e1 (slugrunner) - slugrunner: modify stack priority
  • +
  • 5514e8b (slugrunner) - heroku: remove heroku-16 support
  • +
  • be829fb (slugrunner) - slugrunner: use drycc stack-images
  • +
  • e1e06be (slugrunner) - slugrunner: remove Dockerfile.heroku-16
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.3.0

+
New Drycc Workflow Release v1.3.0
+ +

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.

+

Workflow ## v1.2.0 -> v1.3.0

+

Releases

+
    +
  • builder v1.0.2 -> v1.1.0
  • +
  • slugbuilder v1.1.0 -> v1.1.1
  • +
  • dockerbuilder v1.1.0 -> v1.1.1
  • +
  • controller v1.2.0 -> v1.2.1
  • +
  • slugrunner v1.1.0 -> v1.1.1
  • +
  • database v1.0.0 -> v1.0.1
  • +
  • fluentd v1.0.0 -> v1.0.1
  • +
  • minio v1.0.0 -> v1.0.1
  • +
  • monitor v1.0.0 -> v1.0.1
  • +
  • registry v1.0.1 -> v1.0.2
  • +
  • workflow-manager v1.0.0 -> v1.0.1
  • +
+

Features

+
    +
  • 9c7cceb (builder) - builder: add app config to env
  • +
+

Fixes

+
    +
  • 7fe44fa (controller) - docker: docker timeout must be an int, float or None
  • +
  • b196550 (controller) - controller: revert release.check_image_access for now
  • +
  • cc3ec13 (workflow-manager) - glide: bump goautoneg
  • +
+

Maintenance

+
    +
  • ef932c4 (builder) - controller-sdk-go: upgrade controller-sdk-go
  • +
  • 4654cf6 (controller) - django-rest-framework: upgrade to 3.9.3
  • +
  • 14121f1 (controller) - deps: bump djangorestframework from 3.9.3 to 3.9.4 in /rootfs
  • +
  • 385acdc (controller) - deps: bump django from 1.11.20 to 1.11.21 in /rootfs
  • +
  • fa312bb (database) - postgres: set max_connections = 1024
  • +
  • 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • b8878f6 (dockerbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • b097451 (fluentd) - fluent: upgrade fluent to v1.4
  • +
  • 4341f9a (minio) - mc: upgrade mc and minio
  • +
  • c1ee2a4 (monitor) - monitor: remove copyrights.tar.gz
  • +
  • 9854260 (registry) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • acc5627 (slugbuilder) - slugbuilder: internal support for multi buildpack
  • +
  • d58907e (slugbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • b39a0c2 (slugrunner) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.2.0

+
New Drycc Workflow Release v1.2.0
+ +

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.

+

Workflow ## v1.1.0 -> v1.2.0

+

Releases

+
    +
  • builder v1.0.1 -> v1.0.2
  • +
  • slugbuilder v1.0.0 -> v1.1.0
  • +
  • dockerbuilder v1.0.0 -> v1.1.0
  • +
  • controller v1.1.0 -> v1.2.0
  • +
  • slugrunner v1.0.0 -> v1.1.0
  • +
  • registry v1.0.0 -> v1.0.1
  • +
  • registry-proxy v1.0.1 -> v1.0.2
  • +
+

Features

+
    +
  • e5584e3 (controller) - controller: add STACK support
  • +
  • ad34dc1 (dockerbuilder) - kaniko: use kaniko replace docker-py
  • +
  • b81430e (dockerbuilder) - dockerbuilder: change image to image.json format
  • +
  • 60dde96 (slugbuilder) - slugbuilder: add STACK support
  • +
  • fe8b6e5 (slugrunner) - slugrunner: add STACK support
  • +
+

Maintenance

+
    +
  • 942f050 (builder) - registry: remove env DRYCC_REGISTRY_PROXY_PORT
  • +
  • ff7a16f (builder) - registry: remove ecr and gcr registry
  • +
  • ad13683 (builder) - builder: change DRYCC_BUILD_TYPE to DRYCC_STACK
  • +
  • 6def637 (builder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY
  • +
  • 5044e22 (builder) - registry: remove registry_secret_prefix
  • +
  • 2ea39cc (builder) - controller-go-sdk: upgrade controller-go-sdk
  • +
  • 6aee0d7 (builder) - registry: optimizing variable naming
  • +
  • f9c62d9 (controller) - domain: added reserved domain check
  • +
  • f5a135b (controller) - migrations: clean old migrations
  • +
  • 4369b2c (controller) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY
  • +
  • 1057ca5 (controller) - registry: remove registry_secret_prefix
  • +
  • d114b3e (controller) - docker: update docker client
  • +
  • edbe963 (dockerbuilder) - dockerfile: change base image to alpine
  • +
  • fb35baf (dockerbuilder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY
  • +
  • 946dbf6 (dockerbuilder) - docker: remove insecure support
  • +
  • 628d853 (dockerbuilder) - proxy: add registry proxy
  • +
  • ff27cbd (registry) - env: remove unused env
  • +
  • 7204d72 (registry-proxy) - registry: optimizing variable naming
  • +
+ +
+ + + + + + + + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 000000000..8fd7ac61d --- /dev/null +++ b/blog/index.html @@ -0,0 +1,445 @@ + + + + + + + + + + + + + + + + + + + + + +Blog | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+
Posts in 2024
+
    +
  • +
    +
    Drycc Workflow v1.7.8
    +

    01.05.2024 in Release

    + + + + + + +

    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 …

    +

    Read more

    +
    +
  • +
  • +
    +
    Drycc Workflow v1.7.7
    +

    30.04.2024 in Release

    + + + + + + +

    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 …

    +

    Read more

    +
    +
  • +
  • +
    +
    Drycc Workflow v1.7.6
    +

    27.02.2024 in Release

    + + + + + + +

    Workflow ## v1.7.5 -> v1.7.6 Releases storage v0.0.4 -> v0.0.5 Maintenance 6cb63b6 (storage) - seaweedfs: bump version 3.63

    +

    Read more

    +
    +
  • +
  • +
    +
    Drycc Workflow v1.7.5
    +

    27.02.2024 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
  • +
    +
    Drycc Workflow v1.7.2
    +

    29.01.2024 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
+
Posts in 2023
+
    +
  • +
    +
    Drycc Workflow v1.7.0
    +

    08.12.2023 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
+
Posts in 2022
+
    +
  • +
    +
    Drycc Workflow v1.6.0
    +

    21.10.2022 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
  • +
    +
    Drycc Workflow v1.5.0
    +

    06.10.2022 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
+
Posts in 2021
+
    +
  • +
    +
    Drycc Workflow v1.4.0
    +

    06.10.2021 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
+
Posts in 2020
+
    +
  • +
    +
    Drycc Workflow v1.3.0
    +

    06.10.2020 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
+ +
+
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/index.xml b/blog/index.xml new file mode 100644 index 000000000..dec202249 --- /dev/null +++ b/blog/index.xml @@ -0,0 +1,1818 @@ + + + Drycc – Blog + /blog/ + Recent content in Blog on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Blog: Drycc Workflow v1.7.8 + /blog/2024/05/01/drycc-workflow-v1.7.8/ + Wed, 01 May 2024 00:00:00 +0000 + + /blog/2024/05/01/drycc-workflow-v1.7.8/ + + + + <h2 id="workflow--v177---v178">Workflow ## v1.7.7 -&gt; v1.7.8<a class="td-heading-self-link" href="#workflow--v177---v178" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.6.0 -&gt; v1.7.0</li> +<li>controller v1.8.0 -&gt; v1.9.0</li> +<li>workflow-cli v1.6.0 -&gt; v1.7.0</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/384c7ee9c69201b4d3280bb1582e50ad40210b8f"><code>384c7ee</code></a> (builder) - domain: add procfile_type</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/26c8c7f1a2ed3445fc4a52a5f7b8e7cace8a12e8"><code>26c8c7f</code></a> (controller) - domain: add procfile_type</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/bd49789b2aa8bbb8da440d63c83e339fd69d4774"><code>bd49789</code></a> (workflow-cli) - domain: add procfile_type</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.7 + /blog/2024/04/30/drycc-workflow-v1.7.7/ + Tue, 30 Apr 2024 00:00:00 +0000 + + /blog/2024/04/30/drycc-workflow-v1.7.7/ + + + + <h2 id="workflow--v176---v177">Workflow ## v1.7.6 -&gt; v1.7.7<a class="td-heading-self-link" href="#workflow--v176---v177" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.5.1 -&gt; v1.6.0</li> +<li>controller v1.7.0 -&gt; v1.8.0</li> +<li>database v1.2.1 -&gt; v1.3.0</li> +<li>passport v1.2.0 -&gt; v1.3.0</li> +<li>imagebuilder v1.1.1 -&gt; v1.2.0</li> +<li>fluentbit v0.0.1 -&gt; v0.0.2</li> +<li>logger v1.3.3 -&gt; v1.3.4</li> +<li>storage v0.0.5 -&gt; v0.1.0</li> +<li>gateway v0.0.2 -&gt; v0.0.3</li> +<li>monitor v1.4.0 -&gt; v1.4.1</li> +<li>redis v1.3.2 -&gt; v1.4.0</li> +<li>timeseries v0.0.2 -&gt; v0.1.0</li> +<li>prometheus v0.1.1 -&gt; v0.1.2</li> +<li>rabbitmq v1.2.1 -&gt; v1.3.0</li> +<li>registry v1.2.2 -&gt; v1.3.0</li> +<li>registry-proxy v1.2.1 -&gt; v1.2.2</li> +<li>workflow-cli v1.5.2 -&gt; v1.6.0</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/6c1cf5e514543737c38384596abffca1ac96af44"><code>6c1cf5e</code></a> (builder) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/65ae63c4d3aaff3354d162718ff07c0509b4e689"><code>65ae63c</code></a> (builder) - pipeline: add dryccfile support</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/bb7b11de75226c3a1cb9254dfec78a8edda0c864"><code>bb7b11d</code></a> (builder) - auth: add tokens api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/39d022fe0a4106c91ea461f73728490560f8d653"><code>39d022f</code></a> (controller) - ps: add pod logs support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/86056d06d8992172fe02240d7963aa416ec9c754"><code>86056d0</code></a> (controller) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4cf005c1cc4b361af80ef96597e291ebe3baec24"><code>4cf005c</code></a> (controller) - limits: add limits plan support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bf60e4bdbebb3f3288e0fbd81566c264dd187faf"><code>bf60e4b</code></a> (controller) - controller: add init job</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/98f77a8ceeea6e8a098cd37d79115201c40133e1"><code>98f77a8</code></a> (controller) - pipeline: add dryccfile support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8ce9a83f4bcf46d6039910e052e6ebfa959fd0e8"><code>8ce9a83</code></a> (controller) - cert-manager: add tls events</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7034f5d8347f0c85b40651eaf239a554fd95ae76"><code>7034f5d</code></a> (controller) - config: deploy according to procfile_type</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5554d8f9f26790783d97d6d6128920ffa9b28713"><code>5554d8f</code></a> (controller) - config: add typed_values</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2c5bbad2d74b1c40c61158477aac9103dac2eff4"><code>2c5bbad</code></a> (controller) - auth: add token api</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/410d34e8e639c973557104c3aee14a85324f3c0f"><code>410d34e</code></a> (database) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/693e4d199b18342e33c7ec68c3a651d29b7d9ad6"><code>693e4d1</code></a> (imagebuilder) - pipeline: add dryccfile support</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/7d9cc0679eac7dd873d8db8f9607e347830b2aa1"><code>7d9cc06</code></a> (imagebuilder) - config: add typed values</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/854e1711180de70bc83d3c65721910df013ef988"><code>854e171</code></a> (passport) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/7ac92557670d915c1e568c7297c5ec1b9620f1a1"><code>7ac9255</code></a> (passport) - oauth2: add authorization code for any grant type</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/4517547e21983dd7192ae8cc985c974ed2c64b51"><code>4517547</code></a> (rabbitmq) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/bccfcb43cd63e62974b55523a75fa994ed560453"><code>bccfcb4</code></a> (redis) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/d8876055c0732c470d17d9205a5188289fdac1ec"><code>d887605</code></a> (registry) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/ff09e5b8279cd3343370bfa58c3acba234621263"><code>ff09e5b</code></a> (storage) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/c6e2ac82c8adc75687dbc814cb2163b06820311e"><code>c6e2ac8</code></a> (timeseries) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/22c4c772e3c9cbfe4f686d2fbe161b6484cdcc12"><code>22c4c77</code></a> (workflow-cli) - apps: change drycc run to async</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/a9e6369153255a6cc84dc73e3095086a34d25ad1"><code>a9e6369</code></a> (workflow-cli) - ps: add pod logs support</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/2bc31c8a2010e147b92827a967238e88dca5b743"><code>2bc31c8</code></a> (workflow-cli) - limits: add limits plan support</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/f40398a555e67a942fbe465d29e1076516941d74"><code>f40398a</code></a> (workflow-cli) - pipeline: add dryccfile support</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/03638ffdaefab5e0c7020f6eb279ddeda99aeded"><code>03638ff</code></a> (workflow-cli) - tls: add tls events</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/91136274d87d2cf9e0d2a1dd313d9b948a5d0a81"><code>9113627</code></a> (workflow-cli) - config: add typed values</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/43ee760c4bc93bc5e5402536a09f05dfd6832b7d"><code>43ee760</code></a> (workflow-cli) - auth: add tokens api</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/50dfe6449cbf50bfcf55421f34f2195cb8d7e26c"><code>50dfe64</code></a> (builder) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ab09b243b8484d8a989327e8e3b41f2a23efa643"><code>ab09b24</code></a> (controller) - healthcheck: delete outdated code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/52019b541aaaca98b2b6692fec1290d1231e21fe"><code>52019b5</code></a> (controller) - services: default PORT change error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f57ae429fa4d9dbd89c7cf81f805fe9127930219"><code>f57ae42</code></a> (controller) - certificate: failed to create certificate</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/30c3f548324dcfa571a86afbed64ba0d38b72e99"><code>30c3f54</code></a> (controller) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/dbba43ae315644e858eb2330d52cbf636a366a07"><code>dbba43a</code></a> (controller) - service: update port error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e0459c5d43a74c2c38aae6ebf3e207ad8cc9f283"><code>e0459c5</code></a> (controller) - copy: use deepcopy replace copy</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2122479685d9ce83c986449e20a041de105a2d49"><code>2122479</code></a> (controller) - charts: failed to call webhook</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/53d99775d66648aca41b88992df4ee203cb8f675"><code>53d9977</code></a> (controller) - signals: config limits handle error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/afda287ead80e94a699b3548c01fdfdbd1a6f5a4"><code>afda287</code></a> (controller) - limits: always set default</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/b350cb89e4c313d776592e9e4706909ee72550b5"><code>b350cb8</code></a> (database) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/b48a42243e602637fb04f14cb74d23e23096e2e2"><code>b48a422</code></a> (fluentbit) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/7cebca2a2589c839efbe49cbec6becde85149a8e"><code>7cebca2</code></a> (gateway) - cert-manager: auto tls error</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/190c19bbac3386e277bd7918be5b7f7ad5a25566"><code>190c19b</code></a> (imagebuilder) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2c6a6f9273a0f5e2c16744f6ac6e77d27a7234a2"><code>2c6a6f9</code></a> (logger) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/10bb98df862bebefcf4142e88c24e8f804e310ba"><code>10bb98d</code></a> (monitor) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f8225dca4c4ceae7bc4d613e77ae4c8ebf71838c"><code>f8225dc</code></a> (passport) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/06db66c072006f79c10404812ad9f0902cfb52b7"><code>06db66c</code></a> (prometheus) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/f4aff727962b6afe99e89283ce14ebe8d571d9ab"><code>f4aff72</code></a> (rabbitmq) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/88c18ff452bdd478f49dd88f6595ea096e430f2d"><code>88c18ff</code></a> (redis) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5dcc19d6d47ea30b799ae10e915ebd948b39fc4c"><code>5dcc19d</code></a> (registry) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/092a9398243f19e41ac14cc5fb4f76473848c585"><code>092a939</code></a> (registry-proxy) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/3597ac918db548f837b3262a033d836690378972"><code>3597ac9</code></a> (storage) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/5a49b35d2197c957e43a98e94d38ac8a8ebd894b"><code>5a49b35</code></a> (timeseries) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/0c4a48a84b998b8e7f57f09f307930630e8efd74"><code>0c4a48a</code></a> (workflow-cli) - tls: change issuer options</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/06a2511195bc1f2a3145a73269428200914b4694"><code>06a2511</code></a> (workflow-cli) - tls: info error</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2f7617e164707830b52f2ca39c7f634ca53842ed"><code>2f7617e</code></a> (builder) - go: bump controller-sdk-go version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/aae2f2911197e4643e7a999944401d2e5acd884d"><code>aae2f29</code></a> (builder) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7304980fb22cd0d56e1fa5b1e573b4795ef2ddd9"><code>7304980</code></a> (builder) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/30b648b0d429ba08f89e1d3b49078e40eae2d897"><code>30b648b</code></a> (builder) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2afa006867a3d4d4501578f0973ff759d87af87f"><code>2afa006</code></a> (builder) - controller-sdk-go: bump version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d127a9070a6dd0be1d96860c719d3b4a71eb7bb9"><code>d127a90</code></a> (builder) - config: add typed values</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/32fdfd0e7f54793d3ced05ff42b300173debe866"><code>32fdfd0</code></a> (controller) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0974942fb8a70d9165ef6524744850cf72629a0c"><code>0974942</code></a> (controller) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f401e08d3ffbfee5d84410ad8e31c18a3267513e"><code>f401e08</code></a> (controller) - python: bump python 3.12</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c565959af53e6ab7be7245faea09fd1a30972ac7"><code>c565959</code></a> (controller) - celery: remove retrieve_resource task</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/47be1a10b03d7522a9bc87b9973c8f126db95478"><code>47be1a1</code></a> (controller) - requirements: bump drf 3.15.1</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/99f7468e561d596121bc981294e6ca4baaed2728"><code>99f7468</code></a> (controller) - charts: add config to values.yaml</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7d17f5ca716596ef66046eb5f3606215feb87731"><code>7d17f5c</code></a> (controller) - scale: prohibit scale when there is a running pipeline</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f09e1c9475e64840ff02e23cee30f5911b507a58"><code>f09e1c9</code></a> (controller) - resource: sort services and plans</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e817505fc5dc6a2e9b959b9fd7d63c044f17fcf1"><code>e817505</code></a> (controller) - limits: change default cpu and gpu name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5531b2ff4b15a6b9804cc0b146b69ee7308a1a83"><code>5531b2f</code></a> (controller) - auth: add password login</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/27473f72e8b7c1f1b6bb9c56493688f346bbcc9c"><code>27473f7</code></a> (controller) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c1ee1c7a3103c938b8b81219da7b14cd30f3eceb"><code>c1ee1c7</code></a> (controller) - deps: bump aiohttp from 3.9.3 to 3.9.4 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/affbcb587360d7750f3faf4d022e36032f0b3266"><code>affbcb5</code></a> (database) - postgres: add patroni and postgres params (#15)</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/f9e4edaf9a2a22b974a2aced48a7890f767da0c0"><code>f9e4eda</code></a> (database) - dockerfile: install vi</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/008b7b675c244d2aff9b86947fe907dbb84185f4"><code>008b7b6</code></a> (database) - dockerfile: install vim instand of vi</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/dbbfee12b2fe9c773d32660a6bcf26674ae2cd61"><code>dbbfee1</code></a> (database) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/2e26c333df5aa90243cff8c5159a6c3a9b499a00"><code>2e26c33</code></a> (database) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/a1b81f20f517743d9f69ecda526095a4e9c3ee36"><code>a1b81f2</code></a> (database) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/bc725e8169b25eda4017012f72b5d970147f0d08"><code>bc725e8</code></a> (fluentbit) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/5d738865825bd083561972373a5dd8796a53be6c"><code>5d73886</code></a> (fluentbit) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/b85072d0177447ac3f05f1f4ccd4c9d7f4a56f99"><code>b85072d</code></a> (fluentbit) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/761174ddb5bc06643a02c145714587816ea06f8a"><code>761174d</code></a> (gateway) - gateway: change secrets name</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/1c304da25eef99568badf3ece29639dd6d8f8564"><code>1c304da</code></a> (gateway) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/b919a4c24b5abb776876df002cc9d4c15cf3d50d"><code>b919a4c</code></a> (gateway) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/3cea298be74856a2fba40b0a35824e0f3018dcab"><code>3cea298</code></a> (imagebuilder) - charts: allow all dns</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/653bcbeec95adcea209299751a3a94f3ebaf2d4f"><code>653bcbe</code></a> (imagebuilder) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/59daeab055610ce6cc584be73dba3767158b9747"><code>59daeab</code></a> (imagebuilder) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2834a5acb914eecb7708ad3bd3efdcc38243d784"><code>2834a5a</code></a> (logger) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6685492c2a8493bad3b59dedb201576f7508ff86"><code>6685492</code></a> (logger) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/191cdaf001ab5b916b0edf53aaa2a7558ef7f35a"><code>191cdaf</code></a> (logger) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/b3c3cfa319fe46d30696a2f4637f91636398ffff"><code>b3c3cfa</code></a> (monitor) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/796799db309de06ea54db56a1c0e5f397c858f47"><code>796799d</code></a> (monitor) - grafana: add node metrics dashboard</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/ef2a2228a27e4eddce1ff3b4b56755ab013c47cd"><code>ef2a222</code></a> (monitor) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9c830909640fddca03329d4a72eb91ab1d913c86"><code>9c83090</code></a> (monitor) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/1a97c2cedd3ace5c567bf32dbd057bd215502662"><code>1a97c2c</code></a> (passport) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/353e1ae932ea4dae5112b8f8225ee502695b11ee"><code>353e1ae</code></a> (passport) - logger: add oauth2_provider logger config</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/fe735c0d8c5a2840349b27ceb081d02729ae50bf"><code>fe735c0</code></a> (passport) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/41d6144a20f24461e1a393d4b1957f5be19f4f3a"><code>41d6144</code></a> (passport) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/979d4740bdd50a12f5110144cf413c3972164c90"><code>979d474</code></a> (passport) - python: bump python 3.12</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/e9f41a121e11becd9dcd6b5422dcc6e209cbeedf"><code>e9f41a1</code></a> (passport) - requirements: bump drf 3.15.1</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f479f4d5791ac2917679b70f376ec9bf24fa1fd4"><code>f479f4d</code></a> (passport) - charts: add migrate job</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/ad9abf64ad7e2b959d565eaa0016066183444cd0"><code>ad9abf6</code></a> (passport) - passport: migrations add run_before</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/95ac66705669bd4301af9d3ae812e0843eb6a37c"><code>95ac667</code></a> (passport) - passport: optimize the use of master and slave database rules</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/204f7fc62fd0cdf016cd5e95a4d2fd2e6c841b17"><code>204f7fc</code></a> (passport) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/90a6410c0d0864a434b804cf80fe63960afd4493"><code>90a6410</code></a> (prometheus) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/2d8eb44ef28deae27ac54247a008a5351212eea0"><code>2d8eb44</code></a> (prometheus) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/9687a175b58aed22d314557d7254a82ff0a6d3dd"><code>9687a17</code></a> (rabbitmq) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/35d3d5b7e01bebbeeea5442a22f24d40fcbfdd93"><code>35d3d5b</code></a> (rabbitmq) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/6a6564ddef4f26bc81ea3eb9e965fb8e6180d092"><code>6a6564d</code></a> (rabbitmq) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/cb6722f0df93fae95d4480e1929b55e1e78a2a3a"><code>cb6722f</code></a> (redis) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/9553497d89e358022ab539cb3db658def17bc9cb"><code>9553497</code></a> (redis) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/1c8dc07b0167126d292e3db45f23db5d6ff111dc"><code>1c8dc07</code></a> (redis) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/9fa2a32f965d282940cd3f8489ce8959bb2e791f"><code>9fa2a32</code></a> (registry) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/9b09e51c1d548ba4d1c088aff761391092d746e3"><code>9b09e51</code></a> (registry) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7dbd3902139c8430c18bfb83e4dbce79a6df16a5"><code>7dbd390</code></a> (registry) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/e1d2a33d8c9f20eddce510d79df050b0fe90a94c"><code>e1d2a33</code></a> (registry-proxy) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/3eabfdda5c2a78fc49e73dce382263faad29f5c3"><code>3eabfdd</code></a> (registry-proxy) - charts: remove default limits</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/f8754dad5de5f88bb0f20f46d73e1cbab2aff68e"><code>f8754da</code></a> (registry-proxy) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7df73166e6ea521587eb2ba5b8e1626cc334d7f3"><code>7df7316</code></a> (registry-proxy) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/861d3b8f5ebc2ee32f11a600b26a14d79e0acdf1"><code>861d3b8</code></a> (storage) - filer: modify the default parameters of the filer</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/5fa08da71087503071fa780ac2469f4d55e7d0c5"><code>5fa08da</code></a> (storage) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/22c4620e0e724b26943260d58d749bb4efd0999b"><code>22c4620</code></a> (storage) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/6c1e29c1bf187e2b754d6f683014dba7a4ebe342"><code>6c1e29c</code></a> (timeseries) - postgres: add patroni params</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/e280d3ff2d799fa1e0738bf6e7585aaba0e72c58"><code>e280d3f</code></a> (timeseries) - dockerfile: install vi</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/5213617c4a5ace9225e1cad8348c736b943c5e25"><code>5213617</code></a> (timeseries) - dockerfile: install vim instand of vi</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/a569a57f06484738d5801651f9e253553347f928"><code>a569a57</code></a> (timeseries) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/b93ec702dcbd0e2306d0290cde2d104d4c5897f3"><code>b93ec70</code></a> (timeseries) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/ff3b8705e65a56f0da392519b54f9b060894ec8c"><code>ff3b870</code></a> (timeseries) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/e334f74a71ffbd5f10baa38da43248d92c051322"><code>e334f74</code></a> (workflow-cli) - healthcheck: delete outdated healthcheck style</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/4f8b960e9ddcd1351b4567935d0a8d98d2aa843d"><code>4f8b960</code></a> (workflow-cli) - auth: add password login</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.5 + /blog/2024/02/27/drycc-workflow-v1.7.5/ + Tue, 27 Feb 2024 00:00:00 +0000 + + /blog/2024/02/27/drycc-workflow-v1.7.5/ + + + + <p>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.</p> +<h2 id="workflow--v174---v175">Workflow ## v1.7.4 -&gt; v1.7.5<a class="td-heading-self-link" href="#workflow--v174---v175" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.5.0 -&gt; v1.5.1</li> +<li>controller v1.6.3 -&gt; v1.7.0</li> +<li>logger v1.3.2 -&gt; v1.3.3</li> +<li>storage v0.0.3 -&gt; v0.0.4</li> +<li>redis v1.3.1 -&gt; v1.3.2</li> +<li>rabbitmq v1.2.0 -&gt; v1.2.1</li> +<li>registry v1.2.1 -&gt; v1.2.2</li> +<li>workflow-cli v1.5.1 -&gt; v1.5.2</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/95d130a19f63544defbf415d63ea44b650d07da7"><code>95d130a</code></a> (controller) - controller: volume support nfs</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ee2ee15992331922728aabcf03420fbad7b76a1d"><code>ee2ee15</code></a> (controller) - controller: container entrypoint error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/03ea4f87b58f2e3f12505ff0ba43ab655fdf0528"><code>03ea4f8</code></a> (controller) - controller: class property have been deprecated in python 3.11</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5f04d177fa399a7859d4f0d8e13b58e77983c2e9"><code>5f04d17</code></a> (controller) - controller: miss err msg</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/27972a3a48f5fb67283c50b95e58da7b7ef05458"><code>27972a3</code></a> (controller) - controller: load_db_state_to_k8s err</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a005d629bbdd9a5d68f5bb4c480fd9e6b51300c7"><code>a005d62</code></a> (controller) - controller: volume repeat path no error</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/c7a5ba62b8e513f43aad8143e507d23885558834"><code>c7a5ba6</code></a> (rabbitmq) - rabbitmq: cpu usage to high</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/45c20770d8203ae475c127fe82b00bd04334507d"><code>45c2077</code></a> (workflow-cli) - workflow-cli: miss err msg</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/bc738bd6ef19fa222e675058bc0af79b75026308"><code>bc738bd</code></a> (workflow-cli) - workflow-cli: volumes list format</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/35e1c063c5f40fc97f60ab2a0b9f66de37eef383"><code>35e1c06</code></a> (builder) - builder: bump golang 1.22</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/26caa36c197b968909da1a584dff686cd6bcd651"><code>26caa36</code></a> (controller) - deps: bump aiohttp from 3.9.0 to 3.9.2 in /rootfs (#118)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d938c4f00b4a972abe948dc814b2cbf41ea2b3b"><code>3d938c4</code></a> (controller) - deps: bump django from 4.2.7 to 4.2.10</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/e625c2f86176c0acff331f58f84da15d96041f21"><code>e625c2f</code></a> (logger) - logger: bump golang 1.22</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/bfa500dc9271bf0a475c50feb8e6be8574953bcd"><code>bfa500d</code></a> (redis) - redis: headless svc does not require ports</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/330209a5c329c0f34b47a07812e7282ad7890208"><code>330209a</code></a> (registry) - registry: headless svc does not require ports</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/48c42eb3d6ef09471d26a65c88f5cd88cd6684e8"><code>48c42eb</code></a> (storage) - storage: change volume index to leveldb</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/f4fde9d2c871162c14ecf0e993093211f49e7c66"><code>f4fde9d</code></a> (storage) - storage: add volume size limit</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/33e3684ec520a83bccdf7623d4b3d1317c10e9a0"><code>33e3684</code></a> (workflow-cli) - workflow-cli: volume support nfs</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/48d59507ab5f40e8a8cea9875b230e9e1b97644d"><code>48d5950</code></a> (workflow-cli) - workflow-cli: bump golang 1.22</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.6 + /blog/2024/02/27/drycc-workflow-v1.7.6/ + Tue, 27 Feb 2024 00:00:00 +0000 + + /blog/2024/02/27/drycc-workflow-v1.7.6/ + + + + <h2 id="workflow--v175---v176">Workflow ## v1.7.5 -&gt; v1.7.6<a class="td-heading-self-link" href="#workflow--v175---v176" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>storage v0.0.4 -&gt; v0.0.5</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/6cb63b632ab24cecda10e2e772f46e499d678aa5"><code>6cb63b6</code></a> (storage) - seaweedfs: bump version 3.63</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.2 + /blog/2024/01/29/drycc-workflow-v1.7.2/ + Mon, 29 Jan 2024 00:00:00 +0000 + + /blog/2024/01/29/drycc-workflow-v1.7.2/ + + + + <p>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.</p> +<h2 id="workflow--v171---v172">Workflow ## v1.7.1 -&gt; v1.7.2<a class="td-heading-self-link" href="#workflow--v171---v172" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>controller v1.6.0 -&gt; v1.6.1</li> +<li>logger v1.3.1 -&gt; v1.3.2</li> +<li>storage v0.0.1 -&gt; v0.0.2</li> +<li>timeseries v0.0.1 -&gt; v0.0.2</li> +<li>prometheus v0.1.0 -&gt; v0.1.1</li> +<li>workflow-cli v1.5.0 -&gt; v1.5.1</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2fe80a65e2f564abe94a04a4018af101ca10d55d"><code>2fe80a6</code></a> (controller) - resources: after resources instance update, could not delete (#111)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a4082ad0c4fca861bc713864ec4539249b707c0e"><code>a4082ad</code></a> (controller) - controller: resource status and binding</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e9bfccc307fd9631361eaedd1db0c98fb11f7a9b"><code>e9bfccc</code></a> (controller) - controller: fix multiple volumes mount at one dir error (#116)</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/58d2b4c35020c25e133f46bb48f7b512e41a0f91"><code>58d2b4c</code></a> (logger) - logger: redis conn error block</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/7cb2700c483040869f3fa5ff1af76cf68d8e8711"><code>7cb2700</code></a> (prometheus) - prometheus: prometheus config basic_auth</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/7838c6b63eec363ec0fccbc8a2b455477edb69db"><code>7838c6b</code></a> (storage) - storage: random accesskey secretkey</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/d9dcdfb7350c003a60883c9e70e3afca730d5419"><code>d9dcdfb</code></a> (storage) - storage: pod restart loses data</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/3cbdd29c8dd94d7bd046a3fe817dabbb59887225"><code>3cbdd29</code></a> (storage) - storage: tipd cannot start after deleting pod</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/be7e11fe5a8a861a976c27b69331779b4edd0a3a"><code>be7e11f</code></a> (storage) - storage: jq command not found</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/878f674be07b4aee660ec66830a9fe29473bdaba"><code>878f674</code></a> (storage) - storage: charts updateStrategy error</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/06cfe561e1327690dfcccd7151711053b8126a9a"><code>06cfe56</code></a> (timeseries) - timeseries: the data node ip is incorrect</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7f29f5a98049b0c256728dad38cf63026c45910e"><code>7f29f5a</code></a> (controller) - resources: retrieve resource instance response add message (#112)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4a84dcdca75a3c1cd037c01777cf410c21c56225"><code>4a84dcd</code></a> (controller) - controller: add deploy default annotations (#113)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/829d7e560317a0ac20081f6bd4c81f53b547aac4"><code>829d7e5</code></a> (controller) - controller: modify url match service name (#114)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/30abf6dba46d215d7747b4443826e6e3fac1138a"><code>30abf6d</code></a> (controller) - controller: transfer app ownership in async</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/dc6f45e98ab77a776a620286465da106a8109ba6"><code>dc6f45e</code></a> (controller) - controller: add channel for pod exec</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/af4f3a771d8a7c6f1f99c17acb67704d9f3f921f"><code>af4f3a7</code></a> (controller) - controller: avoid error when secret no data field (#117)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ca27956696aa6bd2e4adefcc6827f840eefd4b34"><code>ca27956</code></a> (controller) - controller: add pod default security</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/b2e9c647ff2a1e7828946d363b6cfc5bdca2deb7"><code>b2e9c64</code></a> (prometheus) - charts: node-exporter mount root (#2)</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/3cdb2b62fe9e2d6f7506c5215be9e3e7d27254b3"><code>3cdb2b6</code></a> (storage) - storage: bump seaweedfs 3.61</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/00dd2fd331104fd4f7ee58ca35a0906588318d16"><code>00dd2fd</code></a> (storage) - storage: add csi daemonset updateStrategy</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/48e763cb34c3e9b1004ad222a1e4670739e0b9ba"><code>48e763c</code></a> (storage) - storage: add drycc storage upgrade document</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/841df90682a121df819ea11ba8d2dc7843ffcd54"><code>841df90</code></a> (storage) - storage: bump seaweedfs 3.62</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/cefd52e7b031efc05f305a8d8f456229418556f8"><code>cefd52e</code></a> (timeseries) - timeseries: add check data node exists</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/ad1c46e39f392dd676a0f5c8e00b05ed1959cb95"><code>ad1c46e</code></a> (workflow-cli) - resources: resources instance add message</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/9f955c2c97a0a2875f7badadb4f868649cf44b2e"><code>9f955c2</code></a> (workflow-cli) - workflow-cli: add short options cpu</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/65399ef156b9fae2d2fe633cb6b4b63fb6263a1c"><code>65399ef</code></a> (workflow-cli) - workflow-cli: add tty resize support</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.0 + /blog/2023/12/08/drycc-workflow-v1.7.0/ + Fri, 08 Dec 2023 00:00:00 +0000 + + /blog/2023/12/08/drycc-workflow-v1.7.0/ + + + + <p>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.</p> +<h2 id="workflow--v160---v170">Workflow ## v1.6.0 -&gt; v1.7.0<a class="td-heading-self-link" href="#workflow--v160---v170" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.4.0 -&gt; v1.5.0</li> +<li>controller v1.5.1 -&gt; v1.6.0</li> +<li>database v1.2.0 -&gt; v1.2.1</li> +<li>passport v1.1.0 -&gt; v1.2.0</li> +<li>imagebuilder v1.1.0 -&gt; v1.1.1</li> +<li>fluentbit v0.0.0 -&gt; v0.0.1</li> +<li>logger v1.3.0 -&gt; v1.3.1</li> +<li>storage v0.0.0 -&gt; v0.0.1</li> +<li>gateway v0.0.0 -&gt; v0.0.1</li> +<li>monitor v1.3.0 -&gt; v1.4.0</li> +<li>redis v1.3.0 -&gt; v1.3.1</li> +<li>timeseries v0.0.0 -&gt; v0.0.1</li> +<li>prometheus v0.0.0 -&gt; v0.1.0</li> +<li>rabbitmq v1.1.0 -&gt; v1.2.0</li> +<li>registry v1.2.0 -&gt; v1.2.1</li> +<li>registry-proxy v1.2.0 -&gt; v1.2.1</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fcbebdae62029cf4308ffc0adeb8a90cf5550077"><code>fcbebda</code></a> (builder) - builder: use TCPRoute expose service</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d02bb5de832e50a281aa550c738b3eb653549806"><code>d02bb5d</code></a> (controller) - controller: support app dns policy config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9aa968ebccdebaf0971a6dbaa890320b9603a6a9"><code>9aa968e</code></a> (controller) - controller: add svc type support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/62e2d348e2987ebcdcaba993559dc1d30a8ffec6"><code>62e2d34</code></a> (controller) - controller: improve the services api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4393755b08a587e093b7603683ac8b5cdf654ac3"><code>4393755</code></a> (controller) - controller: use gateway replace ingress</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/323045d9ab1589c08a8090d7fe9c73ab6276281d"><code>323045d</code></a> (controller) - controller: add canary support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3f81c975baefd4018e6b3426965b4397456f0d0e"><code>3f81c97</code></a> (controller) - gateways: add addresses field</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4e64aa73d0fde9fe667064b420bd9375dbea8397"><code>4e64aa7</code></a> (controller) - gateways: add addresses field</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/02ad5811d9a8d3e031ce97f8ce85d0ce85be7619"><code>02ad581</code></a> (monitor) - grafana: add pd tikv dashboard</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/2a9e2b042941a911a31c846f71988d6eadeff811"><code>2a9e2b0</code></a> (monitor) - monitor: add storage monitor</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/41d5057b1d4067822edcf597e888b3f23e052d9d"><code>41d5057</code></a> (monitor) - grafana: data source change to prometheus</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/ec035d11f3fcf8486f4240aac8db4890e4520b53"><code>ec035d1</code></a> (monitor) - monitor: usegateway replace ingress</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c694c98cfab10d8381fd70d7efbbdaedc26caf2d"><code>c694c98</code></a> (monitor) - grafana: add drycc storage seaweedfs dashboard</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/1e1fdc8a8f3ca0974ff5d06ade500afed29a16ed"><code>1e1fdc8</code></a> (passport) - passport: use gateway replace ingress</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/ffdb408776bfa42c80ba5df56730c689a26a821a"><code>ffdb408</code></a> (prometheus) - prometheus: use gateway replace ingress</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/04152b99ca9a8aacddc246af78968191e41ea9d7"><code>04152b9</code></a> (rabbitmq) - rabbitmq: use gateway replace ingress</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0499500a1335791a89ffcab18e97b22d55ac232c"><code>0499500</code></a> (builder) - builder: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/642491d68a4958cdd6b9b78771ad512d7a462231"><code>642491d</code></a> (builder) - builder: no build log</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/873d146812f40de609100d9a2181d50e79695a54"><code>873d146</code></a> (controller) - controller: do not set entrypoint when no procfile</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d9028c53547b4d53d46d5cba508602ae31d0b391"><code>d9028c5</code></a> (controller) - controller: pip8 error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3efcfb764325255ff9ae4ca47ab82927e88ff9ab"><code>3efcfb7</code></a> (controller) - controller: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/18a3a1a3f777597966da8f8fb21545a18b44d887"><code>18a3a1a</code></a> (controller) - controller: miss service error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/94f796cd2ebd8dd76b4e8073cab039fed0211cae"><code>94f796c</code></a> (controller) - controller: drycc run pod should not restart</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/80f31614601daf30351033c3d9ce8610d4a41581"><code>80f3161</code></a> (controller) - controller: monitor query error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b76f2c5ee9c0e3461737ec7fc6cc73b73a0c043c"><code>b76f2c5</code></a> (controller) - controller: read websocket delay</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b6e068ee19354b98d613985c8c80ec6d42171cc0"><code>b6e068e</code></a> (controller) - controller: metrics sql tpl, gateway pod should not restart, cleanup old rs, update monitor datatbase config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ad9adc645759445702688b2a486ed5d6a1e6a5f7"><code>ad9adc6</code></a> (controller) - controller: rabbitmq sharding err</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/67739075a1134b817e9be97b7d594c1e3790f444"><code>6773907</code></a> (controller) - controller: default k8s pod annotaions</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ffcf1f931c395c3293d909f32a3bf35136b72776"><code>ffcf1f9</code></a> (controller) - controller: under-indented for visual indent</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3afd0cf8e36cec5bbfb59424d5ab036268287d3a"><code>3afd0cf</code></a> (controller) - controller: charts env error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/769bb8b8dc47ef032377a61e6288c514bff16a9b"><code>769bb8b</code></a> (database) - database: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/769bb8b8dc47ef032377a61e6288c514bff16a9b"><code>769bb8b</code></a> (database) - database: label conflict error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/6a321c5c802b3a0826bc283f2ffe429769f8753c"><code>6a321c5</code></a> (database) - database: link error</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/558feae9c0edfb4fa7f0dae08f09dc987f822c88"><code>558feae</code></a> (fluentbit) - fluentbit: build charts error</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/98d8a2a6046dffa3213f84fd5cb2f054727ca798"><code>98d8a2a</code></a> (gateway) - fixup</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/8b5dde1d5b0107913f3fca7c90703902fd9a360e"><code>8b5dde1</code></a> (gateway) - gateway: secretName</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/702866da3014497e303eb346be0f88c3c161586c"><code>702866d</code></a> (gateway) - gateway: build status</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/f55dac1cbab3214f60b33992f3e08e186bfa6198"><code>f55dac1</code></a> (imagebuilder) - imagebuilder: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/ac13b5f036e036073d39ddf2e34627be340df078"><code>ac13b5f</code></a> (imagebuilder) - imagebuilder: build svg</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6b7bbc5a38a8550457585908ac7ce9858c19a034"><code>6b7bbc5</code></a> (logger) - logger: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/0136b5c3ac711f132be35d8382f9df9268145be6"><code>0136b5c</code></a> (monitor) - monitor: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f03d975fe88a4419f58b54f8d1ac944f968b0bfe"><code>f03d975</code></a> (passport) - passport: DRYCC_GRAFANA_DOMAIN error</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/b530ea8960c173b16968dc5c4da5f8e5f783d9dd"><code>b530ea8</code></a> (passport) - passport: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/be5a0a77f5e037456676af5617cdcd01c2f868ea"><code>be5a0a7</code></a> (passport) - passport: change passport</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/1596c7f723d493b8f17e367999e0315d7f2bc205"><code>1596c7f</code></a> (rabbitmq) - rabbitmq: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/0dc4f6fef0bf147e2cec96cd26f490ae5799fa57"><code>0dc4f6f</code></a> (rabbitmq) - rabbitmq: images-shard error</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/43293ae792f0fc8fa932b7fac865f57510de793d"><code>43293ae</code></a> (redis) - redis: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ca13b7d7592995b057f1075b3223074c7a9de54b"><code>ca13b7d</code></a> (registry) - registry: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ab5c7937aac830c2b09b08777f39180248911442"><code>ab5c793</code></a> (registry) - registry: garbage collect error</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/ab0fabc77483f531acaeaa089afce1636200c20a"><code>ab0fabc</code></a> (registry-proxy) - registry-proxy: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/dfc72361f70380697d7090cb0e5bfa61c5264560"><code>dfc7236</code></a> (registry-proxy) - registry-proxy: daemon yaml format</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/42c03bee957cb46b5703cd163cea24c754b3cccc"><code>42c03be</code></a> (storage) - storage: seaweedfs csi error</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/453e41a13ecaedf256dc823c37de3233a2f60cab"><code>453e41a</code></a> (timeseries) - timeseries: could not register node</li> +</ul> +<h4 id="docs">Docs<a class="td-heading-self-link" href="#docs" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/5433c8907bdf4c0320566878a0cfc4f38730f3d4"><code>5433c89</code></a> (gateway) - gateway: add prerequisites</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2f0c5d8ed5a227507f7848426824759db673eb20"><code>2f0c5d8</code></a> (logger) - logger: change architecture</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/bdd02ebf1178209cca08c0e94d76638405100083"><code>bdd02eb</code></a> (builder) - builder: use dynamic clusterrole name</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/66b4b25ec7c517152a37e375f9a7e86e05cceada"><code>66b4b25</code></a> (builder) - builder: upgrade new controller-go-sdk</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/219d86f6bebf11fce80e2535b724bf8ad94b204b"><code>219d86f</code></a> (builder) - builder: upgrade go.mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/91f2f14b0b02af099fe67d4a9be65432de0cb18d"><code>91f2f14</code></a> (builder) - builder: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9abca168d6a8b26f45a3787c2a80bf5aa6354451"><code>9abca16</code></a> (builder) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f43dd5030ac3715ab96cfb2a114bd0416b21110c"><code>f43dd50</code></a> (builder) - deps: bump golang.org/x/net from 0.2.0 to 0.7.0</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0384c69ad46cdabeabb3ca23d01367d047eb0c84"><code>0384c69</code></a> (builder) - builder: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e3149b95e8c64c1d01444d58de67aa4747c4ebf7"><code>e3149b9</code></a> (builder) - builder: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d88ea1bd5538e5425cb4cbb856ab82bb5dfe47e8"><code>d88ea1b</code></a> (builder) - builder: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ba590303b791ff954e41a64ef8babe54170aba3b"><code>ba59030</code></a> (builder) - builder: upgrade go.mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1114dd7d951215c23a6fcefc75a5a71a85391561"><code>1114dd7</code></a> (builder) - builder: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fe50b626d9edf4908f6c820fa2714e5bde0fbc0e"><code>fe50b62</code></a> (builder) - builder: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/db3950cf47cd8f5f0c06c579eec1189c2bcdb0b3"><code>db3950c</code></a> (builder) - builder: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5a508bbc9e21852c4e47e598bb42a7c8c75e93ee"><code>5a508bb</code></a> (builder) - builder: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/bbb9029e773f24d2692afdd801e8d09ca75538a3"><code>bbb9029</code></a> (builder) - deps: bump golang.org/x/net from 0.12.0 to 0.17.0</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f4e5d6ca78d597e020ce398fd9fd132c41591826"><code>f4e5d6c</code></a> (builder) - builder: remove health url</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9111c8ffd87978db6734d405ef0362c34b9fe4ef"><code>9111c8f</code></a> (builder) - builder: remove io/ioutil</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1f36e3ddd67b29571707c57819bdd8148647359c"><code>1f36e3d</code></a> (controller) - deps: bump django from 4.1.2 to 4.1.6 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e4ab434db6fd84cd35a127c8414951df7e138503"><code>e4ab434</code></a> (controller) - controller: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9f0301e4a138d337d9530807b347775d25ee6525"><code>9f0301e</code></a> (controller) - deps: bump django from 4.1.6 to 4.1.7 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/39324238c251f982072b28fdbb79c04df6230889"><code>3932423</code></a> (controller) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ae8b6b464f3733bd0ca743bd419ecf806646909f"><code>ae8b6b4</code></a> (controller) - setting: support KUBERNETES_LIMITS env config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c10b9bc740f74ed820d36ba5cb6eb462bce3bb7c"><code>c10b9bc</code></a> (controller) - controller: using the api_version instead of hard coding</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e6908cd934ec0360344c2120bbd4bd9a27b6fe9d"><code>e6908cd</code></a> (controller) - controller: upgrade requirements</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b0eba0c0f03b3b74bf6b2d013a8e2fd69dd5fc6c"><code>b0eba0c</code></a> (controller) - controller: add route rules serializer</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2e4b6a457f6ab66137badecaa0ce5a020e2208e2"><code>2e4b6a4</code></a> (controller) - controller: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7d32b55dad2a0da5a2d539c970608182dfd00c52"><code>7d32b55</code></a> (controller) - controller: upgrade to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f2dc8dd737e44d1297f6a6903bc17392f767a828"><code>f2dc8dd</code></a> (controller) - controller: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5739b8306921408b11b921515cd6dc7a818e6a1a"><code>5739b83</code></a> (controller) - controller: use timescaledb replace influxdb</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/53892cb796b69ba91b1520ee2b1e35bf6516fb57"><code>53892cb</code></a> (controller) - controller: add timeseries</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0fe0eae17d2af7e0a955d6e8041db22a66b64317"><code>0fe0eae</code></a> (controller) - controller: upgrade requirements</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/18b2a915d043cade51e0d4017d08e4ffa9f54dd6"><code>18b2a91</code></a> (controller) - deps: bump aiohttp from 3.8.4 to 3.8.5 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f50874a6e180d9a18fd3a9b9ad1ec1491acae114"><code>f50874a</code></a> (controller) - controller: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/956cd081922f8eeda637530e8397a40d9f7d9c3d"><code>956cd08</code></a> (controller) - controller: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9ab3ead47263e0f00f5d31afdad028eedefd6a56"><code>9ab3ead</code></a> (controller) - controller: remove passport url check</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a24c7b011de56845fcc0ffaa78424d60e6cb8aac"><code>a24c7b0</code></a> (controller) - controller: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f7e539acb9890593d5b3ba970221f333b81abff5"><code>f7e539a</code></a> (controller) - controller: change celery priority</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ab77a529bc9ac2e61a45af4676b8d8796789f014"><code>ab77a52</code></a> (controller) - controller: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8e27501fc6f024bd590508ad827d6a28ca871776"><code>8e27501</code></a> (controller) - controller: dynamic app storage class</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/385978b8f8a07696196974f7f021886448fbc31c"><code>385978b</code></a> (controller) - controller: list_pods datetime format</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b20362c09cf14cbb64148476948481bca11fcf99"><code>b20362c</code></a> (controller) - deps: bump django from 4.2.3 to 4.2.7 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e11ae1ba7d5ef0423b6a51874704739e6a3c86df"><code>e11ae1b</code></a> (controller) - controller: add cluster migrate</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ca6e9dfa4e90c613572faf449445cebabcf1a310"><code>ca6e9df</code></a> (controller) - controller: async mount</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9a7fbfc5e7037dbcd6f8415da1540fc0d0785bff"><code>9a7fbfc</code></a> (controller) - controller: remove FOSSA</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d55279d81f93783dfdcf0af47c429094fd45019"><code>3d55279</code></a> (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d498a11d8c1179d9ef7e09d4638b10663fc3266d"><code>d498a11</code></a> (controller) - controller: add measure loalancers</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/249a985410e98ab0250af7eaf88c28735f2d7ef1"><code>249a985</code></a> (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b967f5846a006e03d41374266d689a34bd387ba8"><code>b967f58</code></a> (controller) - deps: bump aiohttp from 3.8.6 to 3.9.0 in /rootfs (#107)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8ca9ed61477fe4c538b0eefbe08f42757f9ec527"><code>8ca9ed6</code></a> (controller) - controller: no longer restrict reserved domain</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9ff6649b311185927398a12d55451897015ba491"><code>9ff6649</code></a> (database) - database: add init database configure</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9b4cd26e827862bbcbd2f95eb9ff5aea3031ef80"><code>9b4cd26</code></a> (database) - database: use dynamic clusterrole name</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/b59cde4a41499b1739f51776524c969963706a1e"><code>b59cde4</code></a> (database) - database: remove minio require</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/86462f8e432c21ed691f17544313747a1a95bf2a"><code>86462f8</code></a> (database) - database: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1e8555a4fa0aa4ab14e276af95eeadb11e7ea2f3"><code>1e8555a</code></a> (database) - database: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1b762d54948614e8ff8179f91ba4087c1c24cd93"><code>1b762d5</code></a> (database) - database: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9ffe1fdcc1d1fd33e1d5a69d38c6e2c044f7e002"><code>9ffe1fd</code></a> (database) - database: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/69466d71dfb0fac98f5e2372eae4923d2cb55dde"><code>69466d7</code></a> (database) - database: add database extension</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/beb4b628783f30b8dec35f0ee50d179a27781915"><code>beb4b62</code></a> (database) - database: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/67e27148766a6a16379bccbb160df881e8638cfa"><code>67e2714</code></a> (database) - database: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/8f328f85f28b51b0ea8ce4fe508701c2e875a668"><code>8f328f8</code></a> (fluentbit) - fluentbit: no limit buffer size for kube api</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/fc0552c72b83267e37d67766a0e1040c7d3d59d8"><code>fc0552c</code></a> (fluentbit) - fluentbit: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/63a6cab0c5004ade3c332f16d87f70daaebc12b0"><code>63a6cab</code></a> (fluentbit) - fluentbit: change fluentbit match</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/220f81adae775c21f6eac5fca0f16f2f96962e7d"><code>220f81a</code></a> (fluentbit) - fluentbit: run as no-root</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/aec1393d9e976f2ecb24281a3fc92f5f8bdcf563"><code>aec1393</code></a> (fluentbit) - fluentbit: change configmap name</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/1af4fd24c9e061cb74c3c09af75ad33262a74a19"><code>1af4fd2</code></a> (fluentbit) - fluentbit: change default stream name</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/bef90adfd96f4c713a7de261cb2c66e7cb9900af"><code>bef90ad</code></a> (gateway) - gateway: add route for gateway</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/d523ddb7f794774c5e237c10779fe43713cdc0b6"><code>d523ddb</code></a> (gateway) - gateway: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/d9137f4c7681be9edacc2f1123660d0feb961601"><code>d9137f4</code></a> (gateway) - gateway: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/0425dd4e7a0399fd757a80880e67eda2e8c150fc"><code>0425dd4</code></a> (gateway) - gateway: add customListeners</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/3982b86cb7515d42ead064dee86b931f2f4c58a7"><code>3982b86</code></a> (imagebuilder) - imagebuilder: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/3e4e7a329c7532d8787c9c76eb71d938d12fad45"><code>3e4e7a3</code></a> (imagebuilder) - imagebuilder: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/8df6e8e0e6684a4c4a21bf477958b36eb6750e97"><code>8df6e8e</code></a> (imagebuilder) - imagebuilder: upgrade stack version</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/a5601f7588843698b336eccacbc12559dc915779"><code>a5601f7</code></a> (imagebuilder) - imagebuilder: add drycc_app env</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/07465f8bc16cbb15e12d02d522df94265d503c45"><code>07465f8</code></a> (imagebuilder) - imagebuilder: upgrade to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/00d22d2a3c3fa5dce5595fee94bfa8d5a5ca9b2c"><code>00d22d2</code></a> (imagebuilder) - imagebuilder: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/0b7a24e9211acef3252234e4ebce81353c2a8218"><code>0b7a24e</code></a> (imagebuilder) - imagebuilder: upgrade podman/mc/caddy</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/a7d8be869f0b128e9fc6a28ec5c45e5cdca0ea90"><code>a7d8be8</code></a> (imagebuilder) - imagebuilder: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6b2da83d29e0210a9307e4c5ad1199ed7d7599ce"><code>6b2da83</code></a> (logger) - logger: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/8245b2588a3c350b9c1405c9e56664881534c4b4"><code>8245b25</code></a> (logger) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/f811a74710324fa3ac4ac1fbafc76fe38b042c33"><code>f811a74</code></a> (logger) - logger: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/413f6f60b255f43adbf98cfdbdf2a8325cf3327a"><code>413f6f6</code></a> (logger) - logger: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2ac6b101d2a205cce7653dcbf635cf1afea8e47e"><code>2ac6b10</code></a> (logger) - logger: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2581426b262362e04fc4906cfb7d4567ca58d40a"><code>2581426</code></a> (logger) - logger: bump redis to v9</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/364b25aebe91236be41b5974b3643fc1a2b6d352"><code>364b25a</code></a> (logger) - logger: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/dc169a303663ce319037fcf19d0b6bd164b8ee82"><code>dc169a3</code></a> (logger) - logger: use fluentbit replace fluentd</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/d855d91ba3b4651d2a384f3919a39a84f6794b95"><code>d855d91</code></a> (logger) - logger: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f76723507196a4814dc98e8d9c6403157b6273c4"><code>f767235</code></a> (monitor) - monitor: add off-cluster passport configure</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/ab23936f8d8610f88c061996217b28a8da0ffe3d"><code>ab23936</code></a> (monitor) - monitor: use dynamic clusterrole name</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/47beee0619ee974ad702d813e4db39b187a0507b"><code>47beee0</code></a> (monitor) - monitor: change tikv secret key</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/af7703f7a646a074adf89f9e1d7681bc2a4a8cfb"><code>af7703f</code></a> (monitor) - grafana: remove panel when component off-cluster</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/1b870c2a5b5212d9aeae8dd720bab8190a2b8002"><code>1b870c2</code></a> (monitor) - monitor: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/4a5f1f164c48e93271e28e5a252eb9c87ce4e293"><code>4a5f1f1</code></a> (monitor) - grafana: up ldap api_url config</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/143cabe692cd9d80f909afbe91de0bb8b3c18dea"><code>143cabe</code></a> (monitor) - monitor: add prometheus architecture diagram</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/93091c2dcde35d1ca63450ba08cd2e92b532cdda"><code>93091c2</code></a> (monitor) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/0b7045a1ec3d0061a8434e7e8beed47183287b2c"><code>0b7045a</code></a> (monitor) - grafana: add dashboard kubernetes_deployment_metrics</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/2fb1839f48277724e394b04697d1eb1fb748bf3e"><code>2fb1839</code></a> (monitor) - woodpecker: pipeline config VERSION, when build container image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e2724164a3e2855d1f62e4bdcdcff99f6b10e48f"><code>e272416</code></a> (monitor) - monitor: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/abc0e5373a0aef065fd8887e9f8bee5fd13a5e92"><code>abc0e53</code></a> (monitor) - monitor: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/86cc01bd318becf9528feffcfd7c6080c3faafa2"><code>86cc01b</code></a> (monitor) - monitor: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/1cd849ff6f8367375f6d80430e9fe623ebe0162d"><code>1cd849f</code></a> (monitor) - monitor: add postgresql outputs</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c3205c04418bbb794286eca1bcaa2bf37f26437c"><code>c3205c0</code></a> (monitor) - monitor: change default agent config</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/8c802c01af85fbf40b42c124cd6c72a7c3d8266d"><code>8c802c0</code></a> (monitor) - monitor: add timeseries database</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e9abc40801c5d90934d19b5ca1b838dbdf9b2431"><code>e9abc40</code></a> (monitor) - monitor: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6af66cd45685080c5242f6bc6758df35e0c7a69f"><code>6af66cd</code></a> (monitor) - monitor: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/d02d718b64837e2869aea66f8a9205d0d3205feb"><code>d02d718</code></a> (monitor) - monitor: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/3509c2916b9b6aabe709b0057afdacbdc747e462"><code>3509c29</code></a> (monitor) - monitor: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/ed7bfa2f0c17b3e2577f168af719a6c9b3adc436"><code>ed7bfa2</code></a> (monitor) - monitor: optimize env PROMETHEUS_URL</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/da89befad4be1c66ae33740c7a2567b8b83b6b46"><code>da89bef</code></a> (passport) - passport: charts codereview</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/61c4a964022e28f81727efdc858e5ec3a07a71fb"><code>61c4a96</code></a> (passport) - passport: support init app config</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/91010068522d524dfd6680d09915a5444e29a1ba"><code>9101006</code></a> (passport) - passport: add initApplications to charts</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/7dd7fa414f07cc61771cec2d3e98cc1a32d38a00"><code>7dd7fa4</code></a> (passport) - passport: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/4400199ac576b00e0e268ca74d18ff1da15f32bc"><code>4400199</code></a> (passport) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/6b2c546ec6a5dd0311667cab1ac322819ea71918"><code>6b2c546</code></a> (passport) - passport: change secret name to drycc-passport-auto-tls</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/c8bd824c567bfc68df8fd118ad5a9805242507bd"><code>c8bd824</code></a> (passport) - passport: upgrade requirements</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/aee5aefe0c074816b6ba99624f0e2e5fb6462516"><code>aee5aef</code></a> (passport) - passport: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2d819533a0d6e10534e5a82fac370dd67ef96fc2"><code>2d81953</code></a> (passport) - passport: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/9e662428f39d73651a0c70bd613595c7205c4494"><code>9e66242</code></a> (passport) - passport: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/0fca9982e2ff45bbb5ebe7e3e91fcf0a6af52d94"><code>0fca998</code></a> (passport) - passport: upgrade requirements</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/348252849763e5e96b5908293bd78d84b52b6ad0"><code>3482528</code></a> (passport) - passport: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/0c5ec939da419910c9e98ea97cee9d66916ba14f"><code>0c5ec93</code></a> (passport) - passport: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f7b8f5312d0e9707d2f41b14fb1113e2dfa63dc3"><code>f7b8f53</code></a> (passport) - passport: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/baf69da9f8b9e1858fa89418e12f3133ab567d88"><code>baf69da</code></a> (passport) - passport: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/fcd45dd063da8338c812d5d8af9c41c6d4405826"><code>fcd45dd</code></a> (passport) - passport: add cluster migrate</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/da6d32a3f09d43209fd1037cb1cff810ddcdcf68"><code>da6d32a</code></a> (prometheus) - prometheus: add prometheus-config</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/683de9e2c03941152196e4fb986cb9ce8e7c1a0f"><code>683de9e</code></a> (prometheus) - prometheus: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/3323300fa23d53bc09e3e70041f4a300aaace68b"><code>3323300</code></a> (prometheus) - prometheus: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/da1d356e3f978a01fcbbd6b5996ff9272748ed87"><code>da1d356</code></a> (prometheus) - prometheus: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/4e7a936edaf8446d48b80e69afd610af6d59a6a4"><code>4e7a936</code></a> (prometheus) - prometheus: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/44c1c6f6a3a11cd1792753c7ba94faf6675e8fa3"><code>44c1c6f</code></a> (prometheus) - prometheus: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/d1f1dda09da1cd0b82dd18854e196b206e27e931"><code>d1f1dda</code></a> (prometheus) - prometheus: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/0836fc1cea544fd928fb6727c99ca9369a1c2134"><code>0836fc1</code></a> (prometheus) - prometheus: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/9e132322c6c36fde1a6ce4f8fabce6ffdb73cb32"><code>9e13232</code></a> (prometheus) - prometheus: add LICENSE</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/f53e14a9e741122cef2a88976a4ccafc6ad6f6fd"><code>f53e14a</code></a> (rabbitmq) - rabbitmq: remove auto user</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/0ec7277c5624b35ea1ac9d5d88a9eddb75278794"><code>0ec7277</code></a> (rabbitmq) - rabbitmq: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/f376a30bdb6223f03b7d3e40eb3093616830291b"><code>f376a30</code></a> (rabbitmq) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/51405d8f429584fcf5d38a7b1422971304f3981c"><code>51405d8</code></a> (rabbitmq) - rabbitmq: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/463ca03544a31a0a6c98ceb4862e9cd15a47271b"><code>463ca03</code></a> (rabbitmq) - rabbitmq: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/1978a714c0f868de9d4dfc863be003c313d3db6f"><code>1978a71</code></a> (rabbitmq) - rabbitmq: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/139277f11035e0e548bfdc35272579806cd8bb0c"><code>139277f</code></a> (rabbitmq) - rabbitmq: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/be49741721134fd966c09ea44ef87b705668c8a2"><code>be49741</code></a> (rabbitmq) - rabbitmq: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/6d22518f5bbb3883bc4bdc05b6c93ea6b40e3be9"><code>6d22518</code></a> (rabbitmq) - rabbitmq: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/0eb7833ac8a01bbde78f3e0172e6d3d2948d6234"><code>0eb7833</code></a> (rabbitmq) - rabbitmq: add check shards</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/921106312dc679e79c8dc8ce226ae62fa68ce0ec"><code>9211063</code></a> (rabbitmq) - rabbitmq: erlang vm tuning optimization</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/648a78d9b886890e924250a198624972d28a2ad8"><code>648a78d</code></a> (rabbitmq) - rabbitmq: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/0b43a4d04556eb2bfa81cc8ed22d84d636ad45d1"><code>0b43a4d</code></a> (rabbitmq) - rabbitmq: add x-random exchange</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/ad1c4da3f11a1e690508c71a992a3bda86b56201"><code>ad1c4da</code></a> (redis) - redis: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/3f37f92a06db4b06c105718bec48aeaac2bf1a31"><code>3f37f92</code></a> (redis) - redis: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/e3bef7a15e73fb77ba76ac4f0140fa03ebd2a813"><code>e3bef7a</code></a> (redis) - redis: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/4e806d40f4a203db5c91dd184a712fba8ce55820"><code>4e806d4</code></a> (redis) - redis: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/d5023be85937f1f4cf4b625fb8250a63c4776f3b"><code>d5023be</code></a> (redis) - redis: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/98f5d6fa30d4fb28c89eb547a0e2631aa34a46ac"><code>98f5d6f</code></a> (redis) - redis: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/063f29e85bc565c29d19b900b96017161263cb88"><code>063f29e</code></a> (registry) - registry: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/17bf8ae8cc1a257ff978a6a8ee27d8988f3ed9c2"><code>17bf8ae</code></a> (registry) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7bbad151b1d5c934f9d81a882ea6ebef16bf1723"><code>7bbad15</code></a> (registry) - registry: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/279154fdec97b5e0d28a5c27481928d433ac1369"><code>279154f</code></a> (registry) - registry: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/3e4ae840d5718521278051122c19b96b9dbf2791"><code>3e4ae84</code></a> (registry) - registry: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/fa322d6c372fd6d622a2054584bbcab934ff67f0"><code>fa322d6</code></a> (registry) - registry: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/6c18fe004f3431a59ecd5c874c3bd77af544c661"><code>6c18fe0</code></a> (registry) - registry: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/0bc8472a7baa4b8f982694b97528fa984c03639d"><code>0bc8472</code></a> (registry) - registry: remove health url</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5dacd9f735816decc4b6af7c4994a75ce280d92b"><code>5dacd9f</code></a> (registry) - registry: add wait-for-port check</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/fdeefc3888d5ec0dbfff8db6c797621a90896531"><code>fdeefc3</code></a> (registry) - registry: use headless</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/08bf9f882de2d94f8c3bdefafe24fafa9b9870c4"><code>08bf9f8</code></a> (registry) - registry: change registry port to 5000</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/40bcea2ddf3a6e6316422e14a25df360fb4dcf81"><code>40bcea2</code></a> (registry) - registry: add registry push test</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/871b8e72735b0c17f4c692ea53495e1abb4497d1"><code>871b8e7</code></a> (registry) - registry: add default env</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7f3b3aceea1cc28475f9cec0a3244f693eaf1e6a"><code>7f3b3ac</code></a> (registry) - registry: bump registry 2.8.3</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/569f15dca6d21c69f3ad3734e6509addf2caf913"><code>569f15d</code></a> (registry-proxy) - registry-proxy: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/cc33caf06d9aa2c4bec7a745aa233f8827695972"><code>cc33caf</code></a> (registry-proxy) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/0002aab36b2692250f8653db3505a0300275bea3"><code>0002aab</code></a> (registry-proxy) - registry-proxy: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/40af10ba90e5e0e6e050f5d97625a1294ab6f910"><code>40af10b</code></a> (registry-proxy) - registry-proxy: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/c56b9dff701130403d9d0ecc932069fa16d2e462"><code>c56b9df</code></a> (registry-proxy) - registry-proxy: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/9d5bfe091bddf0f6d7d0cd8995823540b084dc77"><code>9d5bfe0</code></a> (registry-proxy) - registry-proxy: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/e6a33500e5eba9a32baa3f2e9841e67546236965"><code>e6a3350</code></a> (registry-proxy) - registry-proxy: change worker_processes to 1</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/726f39d51f196a28effb917fbacb20db960cf5f3"><code>726f39d</code></a> (storage) - storage: add volume compactionMBps</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/a5aa2d87bd4d320e30833cbe3e3598f5199e7da5"><code>a5aa2d8</code></a> (storage) - storage: add threshold to vacuum and reclaim spaces</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/e687d044f2796dbfef23239df62337b2e658b797"><code>e687d04</code></a> (storage) - storage: delete disk type in single disk case</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/75ee2e4f4acfa1c4fd8f725252ffdc8a30495dda"><code>75ee2e4</code></a> (storage) - storage: change datanode replicas to 4</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/c5fd7bad70e239cd389fc92372305435e099d4ce"><code>c5fd7ba</code></a> (storage) - storage: delete useless env</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/b3826ea800b1fbde96178f590d25361560f3bc3a"><code>b3826ea</code></a> (storage) - storage: add ssd hdd dir</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/29881a0702b1e68e69c86e6ae96da8c4eda209a4"><code>29881a0</code></a> (storage) - storage: add balance cronjob</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/c5a0f512283eb2c32814f3b2f3c0e3ebfb57bd1f"><code>c5a0f51</code></a> (storage) - storage: add defaultReplication for seaweedfs master</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/543c7a273c2988d477782ba97462263c93068669"><code>543c7a2</code></a> (timeseries) - timeseries: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/5376024ea1489cf311fd18dd691ab5b80eb4e5e8"><code>5376024</code></a> (timeseries) - timeseries: update timeseries-service-replica</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/52e8520d0e2bb6b0625304a8e29d3b680bc44840"><code>52e8520</code></a> (timeseries) - timeseries: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/f82657ceb0cdf390fb07e721ce57e07081d43968"><code>f82657c</code></a> (timeseries) - timeseries: add start script</li> +</ul> + + + + + + Blog: Drycc Workflow v1.6.0 + /blog/2022/10/21/drycc-workflow-v1.6.0/ + Fri, 21 Oct 2022 00:00:00 +0000 + + /blog/2022/10/21/drycc-workflow-v1.6.0/ + + + + <p>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.</p> +<h2 id="workflow--v150---v160">Workflow ## v1.5.0 -&gt; v1.6.0<a class="td-heading-self-link" href="#workflow--v150---v160" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.3.0 -&gt; v1.4.0</li> +<li>controller v1.4.0 -&gt; v1.5.0</li> +<li>passport v1.0.0 -&gt; v1.1.0</li> +<li>database v1.1.0 -&gt; v1.2.0</li> +<li>imagebuilder v1.0.1 -&gt; v1.1.0</li> +<li>fluentd v1.2.0 -&gt; v1.3.0</li> +<li>logger v1.2.0 -&gt; v1.3.0</li> +<li>storage v1.2.0 -&gt; v1.3.0</li> +<li>monitor v1.2.0 -&gt; v1.3.0</li> +<li>redis v1.2.0 -&gt; v1.3.0</li> +<li>influxdb v1.1.0 -&gt; v1.2.0</li> +<li>rabbitmq v1.0.0 -&gt; v1.1.0</li> +<li>registry v1.1.0 -&gt; v1.2.0</li> +<li>registry-proxy v1.1.0 -&gt; v1.2.0</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/52517d9323bfcd246e1fd8e13bdee2c45739136a"><code>52517d9</code></a> (builder) - builder: update controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1d78ca01de03c80ac86687999d82dba0077df31a"><code>1d78ca0</code></a> (builder) - builder: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/26b69801c78321da8754c814b6503ec76e857a1b"><code>26b6980</code></a> (builder) - builder: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bfd43851009116d6d4bceb4c46edc3cd21cf9d41"><code>bfd4385</code></a> (controller) - controller: add get manager user status</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/874208d8501198ed8780f2e820ab112d3b78eae2"><code>874208d</code></a> (controller) - controller: unified measurement model</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/cadf98f888c384890c529700c16208b17e17dff2"><code>cadf98f</code></a> (controller) - controller: add admission webhook</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e0050c23869dd3a1d5e8038859a7324484b227b2"><code>e0050c2</code></a> (controller) - controller: new measurement model</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a11ba587b73058c3af610fc9fc101e5d446eb43f"><code>a11ba58</code></a> (controller) - controller: multi pod restart uses async</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/fb3c15d70041d4b215c34b5625cb82ae52279d2b"><code>fb3c15d</code></a> (controller) - controller: add check app owner status</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d78b764c874c30f23aa7e6db9a0d03cb09b6a24"><code>3d78b76</code></a> (controller) - controller: add resource services api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d6a2012ab840dcde1be3c8f197df76eac9c5d88"><code>3d6a201</code></a> (controller) - controller: add search apps api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/01c443a3bf142d6497d20492e3ee7f534db64322"><code>01c443a</code></a> (controller) - controller: add KUBERNETES_CPU_MEMORY_RATIO parameter</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7c2623276991b46b7ac2b8e9d8ce2f84e8ebf26b"><code>7c26232</code></a> (controller) - controller: add volume size limit</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3bee749fc0c670d3ee371c7ffb031f47f0d45873"><code>3bee749</code></a> (controller) - controller: add annotations support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/23cd97c1f213ea9dcec45a4a40e9c3942904e55a"><code>23cd97c</code></a> (controller) - controller: traefik v2 support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e37b7db45049776d7d7455e01f5928986b24b043"><code>e37b7db</code></a> (controller) - controller: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b3b367b108bea56a5fa5ccc603f0dafc14bb5edb"><code>b3b367b</code></a> (controller) - controller: add volume expand support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a4e154aaf0f6cd3b01ebbab0a4af1a4b693a45a4"><code>a4e154a</code></a> (controller) - controller: add database replica support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2f37216fbaed5fa707c76b44881b1f7507a75f49"><code>2f37216</code></a> (controller) - controller: switch wsgi to asgi</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b3314a50607e9d5383d0ce954811827acae8fa05"><code>b3314a5</code></a> (controller) - controller: add pod exec api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/75df2dce65591da4e1e56c7f56a1903749fa4e20"><code>75df2dc</code></a> (controller) - controller: add stream support for app logs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4229badbcd4e367cbe13bf13f2b5c62271b7b31e"><code>4229bad</code></a> (controller) - ccontroller: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/89bb19b20f2eb0d8918cdc7223fa3b117af620d5"><code>89bb19b</code></a> (database) - database: upgrade to pg14</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9f45a5d5e9b7871c47acd73ce227856c1683f6a2"><code>9f45a5d</code></a> (database) - database: add hugepages support</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/c4008c9fbe0f99d1200a58466a15466d92840fa5"><code>c4008c9</code></a> (database) - database: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/411a7b269a3333caed809a1afac69578a7c5ad9b"><code>411a7b2</code></a> (database) - postgres: use patroni</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/64e5cb0aaaacfa2d9976e278583fa700c858ce92"><code>64e5cb0</code></a> (database) - database: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/2bab823194abea35c7a1ff4d59db6a88eb19fcad"><code>2bab823</code></a> (fluentd) - fluentd: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/337ba62d587a4f6c7321aa6ef843d5764692a09e"><code>337ba62</code></a> (imagebuilder) - imagebuilder: run podman as rootless</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/4396ffaeb6a2751e6f78907ac7c517966b5e3c08"><code>4396ffa</code></a> (imagebuilder) - imagebuilder: switch to oci charts</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/f37ae0927023685d88f9e594d8316d8c40cd5296"><code>f37ae09</code></a> (influxdb) - influxdb: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/04503b2c0d5c455c1a106c71be727d2b2b14a2f8"><code>04503b2</code></a> (influxdb) - influxdb: add influxdb ha</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/41ddad5e9acb54fa5bb2c35559615d1cc4fd3af5"><code>41ddad5</code></a> (influxdb) - influxdb: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2006480f82ab4291efa75a69cad0080a29872110"><code>2006480</code></a> (logger) - logger: use redis stream replace nsqd</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/ab23d17f378ea1b740fb4c43dc06f4853d5c729f"><code>ab23d17</code></a> (logger) - logger: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/81d4e9dcde820ab8dc1df6fb99f82fdf39eb35ea"><code>81d4e9d</code></a> (logger) - logger: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c3d9796e21c344d660bfd036d6154c28a3051995"><code>c3d9796</code></a> (monitor) - monitor: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/cd9de3c70c33236975b1d2547b75a66649fba93d"><code>cd9de3c</code></a> (monitor) - monitor: switch to oci charts</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/318a73f7f03c01faa23ce3a89b4b52d5cae4279d"><code>318a73f</code></a> (passport) - passport: add change user confirm</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/79ef1004687152d93a5e60058fd4f40a6273b55a"><code>79ef100</code></a> (passport) - passport: add re login at authorize</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/6927bb5884a7ee332a64afabfd6439467d7fee3c"><code>6927bb5</code></a> (passport) - passport: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3146a0981b744962d68a75fab65e074ab61d4b1c"><code>3146a09</code></a> (passport) - passport: add google reCAPTCHA</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/802abcdd5f0768d75b4fc9f08f46c4b2a590be29"><code>802abcd</code></a> (passport) - passport: add replica database support</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/a0dcd1b7b2bdd3ba247d50fdf554a2918b065588"><code>a0dcd1b</code></a> (passport) - passport: switch wsgi to asgi</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/4c9dbba2b1e79cf9860e19529bd99f52f5588328"><code>4c9dbba</code></a> (passport) - passport: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/74825f7827e22b75938cbcc5bf81ad1a40c4ab37"><code>74825f7</code></a> (rabbitmq) - rabbitmq: add rabbitmq managentment ingress</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/12cf7d60e4e89e3396e786f4487cca55f1322887"><code>12cf7d6</code></a> (rabbitmq) - rabbitmq: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/103417de373246b4f1e0b9cdaf2eaae6ba704dea"><code>103417d</code></a> (rabbitmq) - rabbitmq: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/5d428bbd55c0ec12f6fcafe312b2cd3768fb51d1"><code>5d428bb</code></a> (redis) - redis: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/a88c1a9625757b901515682f39d40a7f5b877f95"><code>a88c1a9</code></a> (redis) - redis: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/541585d4060d6006b99fd3649718566a6ea3163b"><code>541585d</code></a> (registry) - registry: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/e9ca9d475dade575ae13c3b288148b8094faf3f6"><code>e9ca9d4</code></a> (registry) - registry: add garbage-collect cronjob</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ec62a5969747738252132510923637c1b63b63d8"><code>ec62a59</code></a> (registry) - registry: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/fde0b07f243deabc0818efc4088583c6ca6aa5b8"><code>fde0b07</code></a> (registry-proxy) - registry-proxy: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/be14eb42fcda99f9160d21f437858e89337543a2"><code>be14eb4</code></a> (storage) - minio: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/51af6966183c496c9c1374cf4c4fa9b66f319a44"><code>51af696</code></a> (storage) - storage: add k8s csi support</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/76a75d922b965b8961f872b62c67569924e0cf49"><code>76a75d9</code></a> (storage) - storage: add cluster health checker</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/a17dc8cc37c2c2d96acdbcc08a6c2e52676cb777"><code>a17dc8c</code></a> (storage) - storage: switch charts to oci</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e4f44fba4f4a71812b0a1b0d42668d8a6f3bbc65"><code>e4f44fb</code></a> (builder) - builder: no error return</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e38dfc71c5dfa0edafc5603f274235048a3992d7"><code>e38dfc7</code></a> (builder) - builderControllerHost/ControllerPort init error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ff9069fee85633db4801a43d4fa70292099c94dc"><code>ff9069f</code></a> (controller) - controller: influxdb query error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f7f5069569e3f7325fc8fa5f90f8c19e95c0c6ce"><code>f7f5069</code></a> (controller) - controller: authentication 500</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7e297a8996c9fbf490fcbce364c0b4172bdc6388"><code>7e297a8</code></a> (controller) - controller: add check remote user status</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9db28e1ea4627f8f63dcc6f83db2962dc5b47451"><code>9db28e1</code></a> (controller) - controller: celery MaxRetriesExceededError</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4bcff08d38a01a4d7267fef00650395275e3203b"><code>4bcff08</code></a> (controller) - controller: wrong name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d69fde2efc71b015ae2894fcc3efa0cf369457e5"><code>d69fde2</code></a> (controller) - controller: traefik ingress create error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a3ad743c2ecd0528c5c69915272dc68a90fd841a"><code>a3ad743</code></a> (controller) - fixup(controller: user login error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/662c8ddfbcb03d19f5ced769de21964ff5ed413e"><code>662c8dd</code></a> (controller) - controller: change influxdb port</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/957bdf67128b45abad43e8ee560fb6cb749b0783"><code>957bdf6</code></a> (controller) - controller: validate rsa key pairing before storage</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/419ec4c4de6ad77c9cc3f551260fdc35504ceb15"><code>419ec4c</code></a> (controller) - controller: kubernetes pod/exec cluster role</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a67edaae26c00a7ce806bde95b73041ec1c84734"><code>a67edaa</code></a> (controller) - controller: Cannot routing:disable</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e09e2144f1906b19d9b00f0883effe3491198ebf"><code>e09e214</code></a> (controller) - controller: allowlist cannot remove</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/318b1267f35bcf158fc21b20f8e367a3e23fa454"><code>318b126</code></a> (controller) - controller: domains update error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/92855ebc7df34fb8cc5ea440db4f821681ae2408"><code>92855eb</code></a> (database) - database: premission denied</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/bde945ab972d9085009b291c0faac55d8942b014"><code>bde945a</code></a> (database) - fixup(postgres: support arm, fix Failed to build psutil</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/7854d45a2164a1db8ee37bc3ce39c8515bacae30"><code>7854d45</code></a> (database) - fixup(postgres: user name converted to lowercase letters</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/57b2a0708d5ab8fff913e97be09f132074d1ff56"><code>57b2a07</code></a> (fluentd) - fluentd: ifconfig_path not found</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/20e72b962a415773fd97919832c7a0bde9c55a28"><code>20e72b9</code></a> (imagebuilder) - imagebuilder: upgrade pack version</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/651db8a1d2f40f0fafb88f2da4b6fd20ee920715"><code>651db8a</code></a> (imagebuilder) - imagebuilder: chown uid gid order</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/d2e9164afe61fac362beb65ee9113453c2ecd970"><code>d2e9164</code></a> (influxdb) - influxdb: proxy not running</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/3a1d3618d881880abcd752c9c9184a570b38442e"><code>3a1d361</code></a> (monitor) - monitor: charts naming</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/d754ae0244e6e1e300062db24c8e4477b7522715"><code>d754ae0</code></a> (monitor) - monitor: telegraf init error</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/63f9e346a4ded75b7b4f8f0c6708bbe725ee6160"><code>63f9e34</code></a> (monitor) - monitor: affinity error</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/95ae1e5f51e528b75ccae36ad86e9abfbff52050"><code>95ae1e5</code></a> (passport) - passport: yarn build fail</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3f5365e8e5be0b2a486651e87fb5b82fe4668bbc"><code>3f5365e</code></a> (passport) - passport: wrong name</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/907f17b95c1114a802781f2bbec3ba046464f1a8"><code>907f17b</code></a> (passport) - passport: change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/e3911e0f5e9174ab8e7542f60b8bd0c3ff7f85f6"><code>e3911e0</code></a> (passport) - passport: &lsquo;registration_done&rsquo; not found</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2ace5f0a2a363d959a381bd3f759b4990bc13953"><code>2ace5f0</code></a> (passport) - passport: ui style</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/b3ba1e1545f07ee2322850ee6cfb6915ee26967d"><code>b3ba1e1</code></a> (passport) - passport privacy policy link</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/172e9c8b680a83d6c437292febf0418d35c99aa9"><code>172e9c8</code></a> (passport) - passport: check databaseReplicaUrl error</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/a3aeb7052d4ebdbc7bd020850f94921c253a8a38"><code>a3aeb70</code></a> (rabbitmq) - passport: change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/5c73dcf6a8692e83abd40f1d5e991714b3c51876"><code>5c73dcf</code></a> (redis) - reids: DRYCC_REGISTY misspelling</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/d7e3baf4600d87e4d4af2b3e581cb62c591a25b6"><code>d7e3baf</code></a> (redis) - redis: env miss</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/cadaa9151519a4efb52d5c5f779cc0aff0f8fe1e"><code>cadaa91</code></a> (registry) - registry: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/d524217dccfc6dd80c86547d5f2f875b15a8054d"><code>d524217</code></a> (registry) - registry: storage run error</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/854f912bf746ac69d0117378888c1fe8334dd7fb"><code>854f912</code></a> (registry) - registry: chown uid gid order</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/e642bb7452fb62bbc7ce6f1b852e029b88a71488"><code>e642bb7</code></a> (registry-proxy) - registry-proxy: containerPort error</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/8dfd029b78d2dcd1b6bf31960d35234deb6bfc5b"><code>8dfd029</code></a> (registry-proxy) - registry-proxy: chown uid gid order</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/bbea3642114ac83e3c9cb56e7131146378bbf213"><code>bbea364</code></a> (storage) - minio: premission denied</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/97deba16553dd6dc8d2625d8747825692e8667bb"><code>97deba1</code></a> (storage) - storage: node unimplemented error</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/b9bdeff3ef47f43ec12dd16194297d63298fbd34"><code>b9bdeff</code></a> (storage) - storage: pd can not connect each other</li> +</ul> +<h4 id="style">Style<a class="td-heading-self-link" href="#style" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1edb10c23e5ae5654e6a7daf08b7a74fe9c86b74"><code>1edb10c</code></a> (controller) - controller: database convention over configuration</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1960cc3367aa6b0e8f0db5f0117a271c884356a0"><code>1960cc3</code></a> (database) - database: database name convention over configuration</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/06d1f5dd3b7ff353ae26615695732f54dd09e5c7"><code>06d1f5d</code></a> (imagebuilder) - imagebuilder: URL to Url</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/b8a89412e7794fe9e16689d4e8902d34f68a6ce1"><code>b8a8941</code></a> (passport) - passport: database convention over configuration</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8e9a199ac90382e67f64c757d9d207e7aa106c86"><code>8e9a199</code></a> (builder) - builder: upgrade controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/48401512b2eee6a608efe45c962809a4a388ed9a"><code>4840151</code></a> (builder) - builder: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/68ccfb12da3fdc35519b23fdb8212f7de377f8b5"><code>68ccfb1</code></a> (builder) - builder: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8f971cbd509062f952e0b0fe2fdc9983891077ad"><code>8f971cb</code></a> (builder) - builder: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fe2c55d0e5264818e482fcd71510d9a616689c79"><code>fe2c55d</code></a> (builder) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2b5e70609f11eff1eb1e1d8a5591644799fa8982"><code>2b5e706</code></a> (builder) - dockerfile: change user and workdir</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7a6c8d319bcc67e1cbe5a733de773860aa859765"><code>7a6c8d3</code></a> (builder) - builder: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fe494f75669f9e3a51ff32e330edb8c5a33efed7"><code>fe494f7</code></a> (builder) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/a7c87525709c6903e4fb254740eac710c3e18385"><code>a7c8752</code></a> (builder) - builder: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/eb2e94c2ab4358e74a74c8d198eb6798e9bdeae7"><code>eb2e94c</code></a> (builder) - database: bump mc 2022.04.01.23.44.48</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/cfaae66aa31b4b7b28c7d4577e9bf9c7f17a6716"><code>cfaae66</code></a> (builder) - builder: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d7d289060ddafcc94855bb46dc4fbc24cf1c3527"><code>d7d2890</code></a> (builder) - builder: change default imagebuilder registry</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ecfdb19270198fc3f2b46cc0dc91151bd3ebf114"><code>ecfdb19</code></a> (builder) - imagebuilder: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/6da17f489543950af850ee3d5bb4e1cfbcc5cac1"><code>6da17f4</code></a> (builder) - builder: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1a57e5bd5e467b859e0d69e6b3775454132cb225"><code>1a57e5b</code></a> (builder) - builder: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f1464fa6065483d23b98f01a847b73e951f896ae"><code>f1464fa</code></a> (builder) - builder: <a href="https://github.com/minio/minio/issues/13799">https://github.com/minio/minio/issues/13799</a></li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/b1e1c4f5920ba82235a253f9980960ef9dca527d"><code>b1e1c4f</code></a> (builder) - builder: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/71a41453660c6d731247a10e00f94121ae3a69a5"><code>71a4145</code></a> (builder) - builder: bump go.mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/3567688f8809e3805e47170d4b3109a31b1f883f"><code>3567688</code></a> (builder) - builder: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/73ea38b11c631415aa02c5ee43ff92ecfe48348d"><code>73ea38b</code></a> (builder) - builder: change storage to minio</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1f913215ba18670fe83891bf84317b72985151dc"><code>1f91321</code></a> (builder) - builder: use testify replace assert</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d148b9c998759b886ea5493d0e2aa94518d39dcb"><code>d148b9c</code></a> (builder) - builder: add check storage health</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/b768101f69233fa792f3240be47b71b24881e90c"><code>b768101</code></a> (builder) - builder: change initContainers</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1b3bec3ea2783c5124f372c2874c3691b71489cd"><code>1b3bec3</code></a> (builder) - builder: add replicas</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5cb0d618ff5bb1136501f4ba6359e5e5c46a7a63"><code>5cb0d61</code></a> (builder) - builder: upgrade to latest controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/98b9d581209eacabdb9e28c5eb6a7975f13bd454"><code>98b9d58</code></a> (builder) - builder: upgrade new require</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/65817c3e519df8368cd4427f5d366f9edde1fbd5"><code>65817c3</code></a> (builder) - builder: change drycc.cc to <a href="https://www.drycc.cc">www.drycc.cc</a></li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4e3f9d05bb8d00023e6f1927785b7c27d4801652"><code>4e3f9d0</code></a> (controller) - controller: add celery retry mechanism</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f6716fee7625ad8f0cad2b1cf5ad746beb847a65"><code>f6716fe</code></a> (controller) - controller: change cronjob name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/eb606938533da2673ed2aa2986bcb0cdd2c9ee2c"><code>eb60693</code></a> (controller) - controller: refine celery task priority</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/66905e95bb3c9f71fb4c75038199d54c6b5a0edc"><code>66905e9</code></a> (controller) - controller: change manager auth</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ea20c415af0ee4e70f32873748cd979bd36f8240"><code>ea20c41</code></a> (controller) - controller: remove start/stop api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4c8fc807f950064d2cc98ebdd6a51ec86eabb20f"><code>4c8fc80</code></a> (controller) - controller: improve tasks error handling</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/cf7402eaff8373c956e6c0ffa1c7ff479cade8e2"><code>cf7402e</code></a> (controller) - controller: add blocklist api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/80f14dd5b8852c235e3de496261b416c8b59a043"><code>80f14dd</code></a> (controller) - controller: use get_user_model replace auth.User</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ffc7bb790f2257f5e5f9902400f78524d1f528e3"><code>ffc7bb7</code></a> (controller) - controller: use JSONField replace ArrayField</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/370df8c9d011e25785a06e5a4a737dcdb622f4f5"><code>370df8c</code></a> (controller) - controller: add validate metric</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/29084ce759bddd671de4441c6f8e6889774e4c80"><code>29084ce</code></a> (controller) - controller: use user id request manager api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/718fe123eafe5136ac08635c8cf1dbca3dcad4ab"><code>718fe12</code></a> (controller) - controller change urlpatterns order</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/71f40426a65bc6cdc90e6185b1487ae30a3c73de"><code>71f4042</code></a> (controller) - controller: measurements uses lowercase letters</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e5123ea55ae516d94b0cb54ec6ffb464c050ce87"><code>e5123ea</code></a> (controller) - controller: change resource unit to number</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/18fee9aeb1114ea8dbcc4d8eacea93148206e002"><code>18fee9a</code></a> (controller) - deps: bump celery from 5.1.2 to 5.2.2 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ffca6c11c67012e13540e06c12cf30dea5e5cde7"><code>ffca6c1</code></a> (controller) - controller: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9ec12e1ff7bcfb3b72953313484d3f605d97c73b"><code>9ec12e1</code></a> (controller) - controller: simplify drone configuration</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4b4749e2fd391a492fbf40fb7ee25c7b61b52f26"><code>4b4749e</code></a> (controller) - controller: set default CSRF_COOKIE_SECURE false</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2ef6338c20c8625b2cc76c6021149bc07141fcd0"><code>2ef6338</code></a> (controller) - deps: bump django from 3.2.5 to 3.2.10 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c7570d0a40f7daa04de0a4fe1ecbb001e436ee41"><code>c7570d0</code></a> (controller) - deps: bump django from 3.2.10 to 3.2.11 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8b17bc16624fd9caddbbc462cc3487d3500a5216"><code>8b17bc1</code></a> (controller) - controller: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c928fb09f88ce210df7b495b80a005146320e2bf"><code>c928fb0</code></a> (controller) - controller: use rabbitmq cluster</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f9171852a8530c9bd385576517d24172917a1b33"><code>f917185</code></a> (controller) - controller: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/22a8f634a3574553132ecd53e8be467d84a255e9"><code>22a8f63</code></a> (controller) - deps: bump django from 3.2.11 to 3.2.12 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3cc3b00a705b9c7b0ff5d36fb2c0ab4139113dd9"><code>3cc3b00</code></a> (controller) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ee274f6d6728b3b9b3fd91b344be3f8a0d3f737f"><code>ee274f6</code></a> (controller) - controller: set venv profile</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ce6b069644ed3952a47bdd1bd728a395a9f1af05"><code>ce6b069</code></a> (controller) - controller: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3a105d3628e40e2f53dfd2badeb7221555207227"><code>3a105d3</code></a> (controller) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/15f9b0ea96630a818ec191dac15497a5dc99cadc"><code>15f9b0e</code></a> (controller) - controller: code review</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/01e6fd9ef5d730749a33986ff9d58dd854f50cb5"><code>01e6fd9</code></a> (controller) - controller: use passport user id</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/893ee31a1de6036136d0b813d5ff6575267e640a"><code>893ee31</code></a> (controller) - oauth2: update user info pipline</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3028fb470f23d858a5e36312e419dcdfbcc00be0"><code>3028fb4</code></a> (controller) - user: set AnonymousUser username</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5daf82d3bd17f2c653d2db52fb79d2a895ed1335"><code>5daf82d</code></a> (controller) - controller: set worker_cancel_long_running_tasks_on_connection_loss</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/61f2c53a7841099e33c8d5f8d25de311392ce317"><code>61f2c53</code></a> (controller) - controller: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/88feb1df0f3508c29a47ea291f225207a8a4c754"><code>88feb1d</code></a> (controller) - imagebuilder: python=3.10.4 rabbitmq=3.9.14</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/914e03fb8d6d6bff7ef9b5f91b0a3eeedac2ebeb"><code>914e03f</code></a> (controller) - controller: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a5bb548ee73cd201cafe797fdba4fe89e4bbb377"><code>a5bb548</code></a> (controller) - controller: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3ecdd7c05b7cddd640ffe92012b777a80cae1eec"><code>3ecdd7c</code></a> (controller) - controller: add a separate rabbitmqUrl configuration</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/967cb116bdbbf040c3c3c15579bb2d334666d3e8"><code>967cb11</code></a> (controller) - controller: remove APP_STORAGE</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/473d2b5f08c205240b5e081fcb9256d7ecd4cd45"><code>473d2b5</code></a> (controller) - controller: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e410d4cba17662bad797fbd7288052b81e50df29"><code>e410d4c</code></a> (controller) - deps: bump django from 3.2.12 to 3.2.13 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c6ef777035d5e955984f9f4c84fac465943d8b74"><code>c6ef777</code></a> (controller) - controller: simplified passport config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0fd3233f1471b32c621149ac4ca5b5527741fda8"><code>0fd3233</code></a> (controller) - controller: remove settings hardcode</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a64e99cf099eba92c6df749c3c89f4245488b3e4"><code>a64e99c</code></a> (controller) - controller: change passport config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/62aba2594f1240c4368d95c61d75fa08343d05fb"><code>62aba25</code></a> (controller) - controller: set cronjob timezone to utc</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/760b70b635d6eecedfd3d40991740b13e587c1c5"><code>760b70b</code></a> (controller) - controller: change default ratio</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8dffc3afbce3871dc82fe4ce94c92b1fbbacc9b6"><code>8dffc3a</code></a> (controller) - controller: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/26043c40c89cb162b3ce322eba6a79f81a6b24cf"><code>26043c4</code></a> (controller) - controller: change default app storage</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/608bd8da7a7cb75d8fadfa965bcd9ea32e4a96ef"><code>608bd8d</code></a> (controller) - deps: bump django from 3.2.13 to 3.2.14 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/18ed0c2a656497108f98c5c8dbd3b27253dd7915"><code>18ed0c2</code></a> (controller) - controller: remove conjob affinity</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/add671288d5f4af68735a69771f024e4ed856196"><code>add6712</code></a> (controller) - controller: add volume expand support use patch</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/cc1ad1322ba638aa7f6acf45823047712a85e86f"><code>cc1ad13</code></a> (controller) - controller: add startupProbe</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0e9a6033b1a2b66f937010601df70e5625674a66"><code>0e9a603</code></a> (controller) - controller: add clearsocial cronjob</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/eb6f05d969102c008051ebd4c7e39a1300ed1b25"><code>eb6f05d</code></a> (controller) - controller: change initContainers</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/762c6767947b6407a7fb23ffbcb07dc46154b222"><code>762c676</code></a> (controller) - controller: change replicas</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/abd7e8c2210eb1f71c1d280383794af5fa786c98"><code>abd7e8c</code></a> (controller) - deps: bump django from 3.2.14 to 3.2.15 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/07fdf1b9938d868ef55c1d2067258a1eb6c59d23"><code>07fdf1b</code></a> (controller) - controller: remove database conn_max_age</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ef8e41f523aa0159831c95623b96fa74b3570d0c"><code>ef8e41f</code></a> (controller) - controller: add database replica check</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/79143f2301bfc52f8181fc0e0f07263645e065d8"><code>79143f2</code></a> (controller) - controller: upgrade new require</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a62404890973cb26c9360878e7625e15eb87d281"><code>a624048</code></a> (controller) - controller: add app.refresh func annotation</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b22d367d54aa2ab131c8e69491e084dc283826a4"><code>b22d367</code></a> (controller) - controller: optimize app refresh timing</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/fe98f0c8f3d2cfebc2b6ad13927627ebee96e39e"><code>fe98f0c</code></a> (database) - database: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/5e00c118e5830c43158417486b83602d1e9839ff"><code>5e00c11</code></a> (database) - database: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/d2cb8607a95e098fe0c50a82ebadd3393a52cd56"><code>d2cb860</code></a> (database) - database: disable huge_pages</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/197d80d95e42443351abbf1aae216d5f80073334"><code>197d80d</code></a> (database) - database: add persistence</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1c3e64596ee5970c3ef7a1daeee86ced68ae3ec1"><code>1c3e645</code></a> (database) - database: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/37730ab6ca7ac86728f9fe0f1c41240402abb9bc"><code>37730ab</code></a> (database) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/5014112dd279d1e3a8d5b6fa23797d0996fb2047"><code>5014112</code></a> (database) - dockerfile: change entrypoint</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/29b538e8b33cd19bb3a781abb8335905fa7a533f"><code>29b538e</code></a> (database) - database: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/c2bb0746172d4dc764cd8543d98bb6cbd9205cf9"><code>c2bb074</code></a> (database) - database: bump python 3.10.4 and mc 2022.04.01.23.44.48</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/077a4e95b2ee3d772e030971218e880f31a55e4c"><code>077a4e9</code></a> (database) - database: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/560bdb97a46897ae0fd464ca6e2b54d129d91b37"><code>560bdb9</code></a> (database) - database: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1e54b554f4a29df49ac42ba046f00f71a105f84e"><code>1e54b55</code></a> (database) - database: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/d6466723b4f949a4771d7415f1a80924f398963d"><code>d646672</code></a> (database) - database: <a href="https://github.com/minio/minio/issues/13799">https://github.com/minio/minio/issues/13799</a></li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/a6ac4e350fec8e27c1bdc560130c585d3a7ab7d2"><code>a6ac4e3</code></a> (database) - database: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9618d87f3bc63c8933553278e88c7d6758b9e2af"><code>9618d87</code></a> (database) - database: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/b8232737ff893b064a558821da49b40905b4e83d"><code>b823273</code></a> (database) - database: change minio to storage</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/7bd5a90fe97b9b0ec20f5305431891f10a975c61"><code>7bd5a90</code></a> (database) - database: add check storage health</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/20c6d96e16b2dc7fc7d1bf75a8b44dd6ca459f6f"><code>20c6d96</code></a> (database) - database: fix storage run error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/8bde83071df44a11b01ae13fbe2676567780170b"><code>8bde830</code></a> (database) - database: upgrade to pg 14.5</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a33b5e5ef09bfc8cf5fbf79fd11dee4766a910e2"><code>a33b5e5</code></a> (fluentd) - fluentd: update plugins</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/eed7a7804b91dba5c31762adcf1245950365b4fe"><code>eed7a78</code></a> (fluentd) - fluentd: update filter kubernetes setting</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/cc83dd87809f1b71e18636240582c0a58eb73ad2"><code>cc83dd8</code></a> (fluentd) - fluentd: update elasticsearch store setting and support exclude specific container logs</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/ba2feb28bc7a96ec2a0632c5c4070d5300de3c37"><code>ba2feb2</code></a> (fluentd) - fluentd: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/d528676b75699d731ceba78ca7b207bd1472aed6"><code>d528676</code></a> (fluentd) - fluentd: simplify drone configuration</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/dece82d3a85c2b69d4315d324d03fd1f523e53fa"><code>dece82d</code></a> (fluentd) - fluentd: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/4e0a80244c190607f9e706fdeed0f3829c505a76"><code>4e0a802</code></a> (fluentd) - fluend: replace nsqd with redis</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/15ceca0cdbfb56e03b96cfd96e9b13909667f2e3"><code>15ceca0</code></a> (fluentd) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a7f619f70d0fb77d08f544dc593d033396b984af"><code>a7f619f</code></a> (fluentd) - dockerfile: change workdir</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/9adf5ed9a2387c79a596a4e8fddcc099316e9fd8"><code>9adf5ed</code></a> (fluentd) - database: bump fluentd 1.14.6</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/50c14c28eb1f3c673787b1f59f6b713995cd1441"><code>50c14c2</code></a> (fluentd) - fluentd: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/83171b1e36a4fc787459ffdceb9a2573b518a287"><code>83171b1</code></a> (fluentd) - fluentd: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/ec8358165e029e7c82316877f629b128bb3a00f7"><code>ec83581</code></a> (fluentd) - fluentd: unified reids declaration</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/07c63e24a3760a0604d3c17936690f31380e7b8c"><code>07c63e2</code></a> (fluentd) - fluentd: upgrade fluentd 1.15.2</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/65df9be7b31a93f6ea30d259cb13cf0401d78234"><code>65df9be</code></a> (imagebuilder) - imagebuilder: update pack version</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/66cab351e53388cdb2bddf4f415240883c3217f9"><code>66cab35</code></a> (imagebuilder) - imagebuilder: use dind replace go-dev</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/0c8206098ba01f01039c1b563238a6612e6a1fed"><code>0c82060</code></a> (imagebuilder) - imagebuilder: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/8146da94bfef611398b03c70be316676aa49f626"><code>8146da9</code></a> (imagebuilder) - imagebuilder: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/7d97241d42a0282255d9c1d6a823159671f25fd4"><code>7d97241</code></a> (imagebuilder) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/07e805c48d9f9ccf44e23d91791995f38fa28345"><code>07e805c</code></a> (imagebuilder) - imagebuilder: change default buildpack</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/8d1038df7e714b72d43b491a3fddb36639736937"><code>8d1038d</code></a> (imagebuilder) - imagebuilder: upgrade podman to 4.0.1</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/62d3687a1edeefee68d5fedfb59eea38e791a3f7"><code>62d3687</code></a> (imagebuilder) - imagebuilder: change workdir to /workspace</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/da8bfb0f576bc292eb6427f7945271cc00fcb0ce"><code>da8bfb0</code></a> (imagebuilder) - imagebuilder: change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/d44e3bc2007f4e70c7dfa6d59279e7643345bd46"><code>d44e3bc</code></a> (imagebuilder) - imagebuilder: upgrade stack</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/5b0c7e69839ac408230bc142a2ba42953a068216"><code>5b0c7e6</code></a> (imagebuilder) - imagebuilder: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/f74cbf6113d99064c5b734da329980434c4f854a"><code>f74cbf6</code></a> (imagebuilder) - imagebuilder: add defaultBuildpacksURL</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/941d4939323573679841cc114669e1dec2154f94"><code>941d493</code></a> (imagebuilder) - imagebuilder: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/449be91d0c64e4e7947de68c4e35fcfd8a944a14"><code>449be91</code></a> (imagebuilder) - imagebuilder: <a href="https://github.com/minio/minio/issues/13799">https://github.com/minio/minio/issues/13799</a></li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/63b052341db3e1dcd2458ded7be233ec9877a3bf"><code>63b0523</code></a> (imagebuilder) - imagebuilder: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/4e8a6e570108c8db393c764bd6cfa8f66cb126c7"><code>4e8a6e5</code></a> (imagebuilder) - imagebuilder: add imagebuilder config</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/2d891f53998f135bc91c34ff1e80189e01969ab5"><code>2d891f5</code></a> (imagebuilder) - imagebuilder: change minio to storage</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/addceda27e7416c7e75d7502265448a95377ed4d"><code>addceda</code></a> (imagebuilder) - imagebuilder: upgrade new require</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/a6e569fdfaf379bb7c64c32e2406ecbb61ad890f"><code>a6e569f</code></a> (imagebuilder) - imagebuilder: pack_build add &ndash;env-file parameter</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/6191ff5c4cc132b0a5f9bf4bc227f8a64ed0c327"><code>6191ff5</code></a> (influxdb) - influxdb: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/dc3f8c7ed955953e4b576111edde4f05726a86cb"><code>dc3f8c7</code></a> (influxdb) - influxdb: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/6b5c81922dd498c0abb22e44ff85226881df187f"><code>6b5c819</code></a> (influxdb) - influxdb: new ingress style</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/68b381d1f377bdd805d4db86fb244ece080851bc"><code>68b381d</code></a> (influxdb) - influxdb: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/ea20eb81c27c90d8038872a9b5517ea1a7eafb8f"><code>ea20eb8</code></a> (influxdb) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/64c0a71ef6d0139d8c8df6b8823f53d444df1adf"><code>64c0a71</code></a> (influxdb) - influxdb: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/a709ca19e2ee8a37f9f46263a714aea85e413391"><code>a709ca1</code></a> (influxdb) - influxdb: use DRYCC_UID DRYCC_GID env</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/740dff00afe4b6b207d3e64819745702861e7b8b"><code>740dff0</code></a> (influxdb) - influxdb: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/e0356737f548edc85730aecbbf3ac402ef0fc3a0"><code>e035673</code></a> (influxdb) - influxdb: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/f1cefbd0b3107e5a4a228cce55e580eda0a6e849"><code>f1cefbd</code></a> (influxdb) - influxdb: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/a00100ebf6f1f8ee29d0341689823be68297a9f6"><code>a00100e</code></a> (influxdb) - influxdb: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/9d165ef2cf43f2abceba893a883e34285e694cb3"><code>9d165ef</code></a> (influxdb) - influxdb: add probe</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/bee7fff49a4c9410c5ccae1f3a2435ac0b505e82"><code>bee7fff</code></a> (influxdb) - influxdb: upgrade to influxdb 2.4.0</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/254914c02d7bd968e52586a52b8749d5b3fb6388"><code>254914c</code></a> (logger) - logger: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/8d91c68965c76c955300ec0f2e583020c14465e7"><code>8d91c68</code></a> (logger) - logger: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/b6d21828ed8355c658716f9684c7dee4c73a964f"><code>b6d2182</code></a> (logger) - logger: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/c35e59a79f6ccd9946db9979abb9f5125c899695"><code>c35e59a</code></a> (logger) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a63c07029db0b5f7ec7dc38f4f60489956944475"><code>a63c070</code></a> (logger) - logger: change workdir to /workspace</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a594b28985d601c0289deedef07ac09ccd58a1f4"><code>a594b28</code></a> (logger) - logger: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/9a90e22cac7243e36d88d33f95369a7a5b0a5baf"><code>9a90e22</code></a> (logger) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/36493b41b11e8847d578dd9563d581bf25adcb2e"><code>36493b4</code></a> (logger) - logger: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/897a3a5a77ea96250b76bcf06274179c85549c86"><code>897a3a5</code></a> (logger) - logger: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/03b32ab19cd49ddeb966682fe5e7dd4c3b34235e"><code>03b32ab</code></a> (logger) - logger: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a50ba5fcd9ef8205a1b5064789735241b5ece4b8"><code>a50ba5f</code></a> (logger) - logger: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/23187a3fe6e2ffe2d4fc38a705e72c14a85fbb67"><code>23187a3</code></a> (logger) - logger: unified reids declaration</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/aaa129ade36389917750e10389b3274331caf03a"><code>aaa129a</code></a> (logger) - logger: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/be4f65615f0735303f9be4f9d67158979741b395"><code>be4f656</code></a> (logger) - logger: add replicas</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/7c25459be3cb002ea933a47e9ec318d20d69616b"><code>7c25459</code></a> (logger) - charts: add NetworkPolicy</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6810149b5d3d6199c69909374a72836287f66b9e"><code>6810149</code></a> (logger) - logger: remove memory storage</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a918c50d5294d3ac8bd6d156d0a63ecd373ba72c"><code>a918c50</code></a> (logger) - logger: add .vscode to .gitignore</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a41521029d715d227582cb00edc64953028f5983"><code>a415210</code></a> (logger) - logger: add log follow support</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/59b1da3a3172da80b3b16205a6dc420a79208450"><code>59b1da3</code></a> (logger) - logger: upgrade new require</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/27cc151c73ef774d4799e04431748bdd8ffbeea5"><code>27cc151</code></a> (monitor) - monitor: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/07d6a9dff96571e1445fb04da374935062fa18e0"><code>07d6a9d</code></a> (monitor) - monitor: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/105435759e1f9250aaf0e7c0ea8d5b34aa2e0a76"><code>1054357</code></a> (monitor) - monitor: use redis default port</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e3673dfa93515ecd8507a00b2081ab7749091038"><code>e3673df</code></a> (monitor) - monitor: remove nsqd</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/fc9dd3ed61d7990e451af7b28d7691a6a0557e28"><code>fc9dd3e</code></a> (monitor) - monitor: new ingress style</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/856a898d34a21c18479f11c20926621bcb75894d"><code>856a898</code></a> (monitor) - monitor: add default user env</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9857535c0cdb43253706d3f6d47d15fd0cc592cd"><code>9857535</code></a> (monitor) - monitor: add random user</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/38b5a040f4617782597abd1ed63f2ac732c64bb8"><code>38b5a04</code></a> (monitor) - grafana: oauth auto login</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/5dfc5797cc291d2a6387713989bc0eb5c130127b"><code>5dfc579</code></a> (monitor) - monitor: upgrade version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e121b5a7844ed76b7cca01a89c0cfdbc36438487"><code>e121b5a</code></a> (monitor) - monitor: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/84462a03ead9ebc1addf53ede3089f4abb0db1f0"><code>84462a0</code></a> (monitor) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/b9e8ce8c0775c6ce6725200ca8639b372a91bbe9"><code>b9e8ce8</code></a> (monitor) - monitor: chore(imagebuilder): change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/05ee8abd8e44a731e070c6417b00f9a777649c22"><code>05ee8ab</code></a> (monitor) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e1fa68e170a1b4c8a1fd6ee67d211cb023cb6963"><code>e1fa68e</code></a> (monitor) - monitor: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/b8f302b73ef2f71f53d3c165db6ca0f9d446e294"><code>b8f302b</code></a> (monitor) - monitor: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/4fc991f9be7d47ea1a029d57bbc8c7fb3c80bd5d"><code>4fc991f</code></a> (monitor) - database: bump telegraf 1.22.0 and grafana 8.4.5</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/21a2f6a6b23f23308d50f97ad99b9164919ff5b8"><code>21a2f6a</code></a> (monitor) - monitor: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/acc976f8c3a834f511cb482de03b0e6473de855f"><code>acc976f</code></a> (monitor) - monitor: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/62d76c13d28d136aba544749a837426f3317a794"><code>62d76c1</code></a> (monitor) - monitor: unified reids declaration</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/b3c57ad982406161ef60f04442d4dd9cee91b5b1"><code>b3c57ad</code></a> (monitor) - monitor: optimize oauth2 configuration</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/70af6b07c4c724fbd3070776f4863bffb381d549"><code>70af6b0</code></a> (monitor) - monitor: change passport config</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/69f9a888501b560c698bc6781a80752180f86f04"><code>69f9a88</code></a> (monitor) - monitor: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/2fb278f0ce0d7b9d606b04a4afc297ce44c146f4"><code>2fb278f</code></a> (monitor) - monitor: rename influxdb port</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/17548ffc21f7e10499c535c55ffb413f28576727"><code>17548ff</code></a> (monitor) - grafana: update dashborad</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/69d7bbda0547bae588e01dbcf167d31dfc7debfe"><code>69d7bbd</code></a> (monitor) - grafana: influx dashborad disk size</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/75db1b021bdd974f23f769ae69c9e33aed420d6e"><code>75db1b0</code></a> (monitor) - monitor: upgrade new grafana/telegraf</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/80504a1bb18cfd20493406dccf01e0de1b83713e"><code>80504a1</code></a> (monitor) - grafana: update influx and redis dashboard</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f7078cba8022651a395db8484be72ca8156556dd"><code>f7078cb</code></a> (monitor) - monitor:chown use env</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/91ae0ddb94a172421923af2b63918b051bc65695"><code>91ae0dd</code></a> (passport) - passport: optimize login display</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2d3bbbca40f25656872268f3862f71047f861349"><code>2d3bbbc</code></a> (passport) - passport: change drycc logo</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/59790a747eb6bf83345b57dbd3b27d23b760d48e"><code>59790a7</code></a> (passport) - passport: make user email unique</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/faea034774c19cfac3e5858262600cf1842601ed"><code>faea034</code></a> (passport) - passport: use strtobool</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/1fbf2bc2ce25b003a4f424efeeb67a54408b7744"><code>1fbf2bc</code></a> (passport) - passport: use yarn replace npm</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/119cac8f95d371bc51803dd482d9195460e1ede3"><code>119cac8</code></a> (passport) - passport: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/cff5062a2d8acc931c7a88d3afb7b7b8effd2642"><code>cff5062</code></a> (passport) - passport: set default CSRF_COOKIE_SECURE false</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/9cc021077c3f4f3992727c6661ac758bc8f9e60d"><code>9cc0210</code></a> (passport) - passport: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/9ab38969eff6a8bc8b33166ccd5352b0158e5c17"><code>9ab3896</code></a> (passport) - passport: new ingress style</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/259ccc91b805ed463ff0b0889a58debd78214fc2"><code>259ccc9</code></a> (passport) - passport: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/af1bbcdce7c677597c9647b27e96a1e3fcde7f5e"><code>af1bbcd</code></a> (passport) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/9ae5373f0ce8d6ec3a3f2f2915c9e6b08ca1a025"><code>9ae5373</code></a> (passport) - passport: set venv profile</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/8f610901ad7f5aa175433c2c160076cd0bcc3a15"><code>8f61090</code></a> (passport) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/fcaf72dc9e5f196dc671a8a887ac33dcc4e1b5e2"><code>fcaf72d</code></a> (passport) - passport: upgrade npm package</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/546dcd5b8d668635ada247c7f44d95c0a001bac9"><code>546dcd5</code></a> (passport) - passport: add license</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/4bda2d661883876248c0dd0211fe15551c888c56"><code>4bda2d6</code></a> (passport) - passport: use minify</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/73b0fd135a91bf0e5c6238a659b0e41a5603d179"><code>73b0fd1</code></a> (passport) - passport: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/278fe7a321f4a8561094d0cd8789918a1fd9a5fa"><code>278fe7a</code></a> (passport) - passport: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3cd93d36d49972d4c87fc6fc7cbf38c8b6bd8a1b"><code>3cd93d3</code></a> (passport) - passport: add reactive</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/370b493ccac77e04b1366b4037e9fa7f46d4fda1"><code>370b493</code></a> (passport) - passport: add footer</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/483cbd6ae503b4a3116b673272526a842cd1dcff"><code>483cbd6</code></a> (passport) - passport: use h_captcha replace re_captcha</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3d1675e2af62a5c858b1ae28385af97257c140d8"><code>3d1675e</code></a> (passport) - database: bump python 3.10.4 and node 16.14.2</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/86a783592e559b0a13d2cffcbea6bb4dd7e33684"><code>86a7835</code></a> (passport) - passport: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2d65355b89a12658a69fad874add357378aedf83"><code>2d65355</code></a> (passport) - passport: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/90c1444d2f1f45658fe5a51f406ca58485eb251c"><code>90c1444</code></a> (passport) - passport: unified reids declaration</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2e0e417f1ce86eff2c4d4f35bf5c40e230382cb8"><code>2e0e417</code></a> (passport) - passport: fix firefox footer</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/ad274bed8c36be339d461c657403070abbb695c6"><code>ad274be</code></a> (passport) - passport: use bulecss</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f986d8b3a47d9fd83831fece5000189b1ca82dfc"><code>f986d8b</code></a> (passport) - passport: add main footer</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3e528676fed3aae01fedbc1be39bcab7e997f088"><code>3e52867</code></a> (passport) - passport: dynamic settings for vue</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/38adabc356280f02d3cc048bd00b8ec1be8d91a8"><code>38adabc</code></a> (passport) - passport: change passport config</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f8d6b604a6009be7b04d4b97d3457dcc0ba1b697"><code>f8d6b60</code></a> (passport) - passport: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2cbd79daaeb948f274552e897acd53d0bddefb69"><code>2cbd79d</code></a> (passport) - passport: remove database conn_max_age</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/712279768f9c4dee75e5f0f6f6a1ab0865d5e701"><code>7122797</code></a> (passport) - passport: change drycc.cc to <a href="https://www.drycc.cc">www.drycc.cc</a></li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/8cc84cdb7717cc5a50353f7c32e745725c4c5973"><code>8cc84cd</code></a> (rabbitmq) - rabbitmq: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/f35930fb57b5a0b15c82be2f09879de46bd027e7"><code>f35930f</code></a> (rabbitmq) - rabbitmq: add rabbitmq cluster support</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/fbfa3ba8ff88b80d736ae2dee02575d43754529e"><code>fbfa3ba</code></a> (rabbitmq) - rabbitmq: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/ca607015c53dbf68bcdfe636ff46ce17cb973a01"><code>ca60701</code></a> (rabbitmq) - rabbitmq: use volumeClaimTemplates</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/fe5d1b41f48a729f1ada17ddaec4fd738d2c5c26"><code>fe5d1b4</code></a> (rabbitmq) - rabbitmq: add sharding support</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/9c4ab976e148b46d7fb2ba218254bb4cb8789152"><code>9c4ab97</code></a> (rabbitmq) - rabbitmq: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/348a88a95bad2b93971805ae9563555bfbd4ab00"><code>348a88a</code></a> (rabbitmq) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/2388be18e4d23623cc5b461a31f4dbc13562762f"><code>2388be1</code></a> (rabbitmq) - rabbitmq: upgrade erlang to 24.2.2</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/db2eaa5fac326200594c9768a6e6ce85721a8cea"><code>db2eaa5</code></a> (rabbitmq) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/772afd1f7ed5732355bb9af28018d542d0c6e837"><code>772afd1</code></a> (rabbitmq) - rabbitmq: change to wait pid file</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/2bfc25ec33619c1b10be7639c819c8c2f383bbaf"><code>2bfc25e</code></a> (rabbitmq) - rabbitmq: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/11d505ea19d520d98f74457054dfdbe9e91a98fc"><code>11d505e</code></a> (rabbitmq) - rabbitmq: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/69d63f1c0ce2ed2a0a80945582db041e5dd7bb7e"><code>69d63f1</code></a> (rabbitmq) - database: bump erlang 24.3.3 and rabbitmq 3.9.14</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/838029926101907d9da255e2cbcabc97dd1b0dba"><code>8380299</code></a> (rabbitmq) - rabbitmq: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/b3f69f14a151124887f49a9c4740905221d8f65a"><code>b3f69f1</code></a> (rabbitmq) - rabbitmq: add check rabbitmqLocaltion</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/5327c76d66cb6339d68036aeff52f13f315ca4f0"><code>5327c76</code></a> (rabbitmq) - rabbitmq: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/5c66b5a74037aa530ed84203c153a7d83f2ba6cc"><code>5c66b5a</code></a> (rabbitmq) - rabbitmq: change probe</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/27bebf99a4fac504dc3e4a2a8d395cc5c23c9ff4"><code>27bebf9</code></a> (rabbitmq) - rabbitmq: add start-rabbitmq script</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/86ee6a780841f4f4927aa4dc6bbc50362fc5f5a0"><code>86ee6a7</code></a> (rabbitmq) - rabbitmq: upgrade to rabbitmq 3.10.7</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/1f29683eb9630822c50687276941bf10b2e1c014"><code>1f29683</code></a> (redis) - redis: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/a5041fc911aa86b277f3577949637f090d7d0488"><code>a5041fc</code></a> (redis) - redis: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/64468c2257c828e61d183d4680b632ea0a24021e"><code>64468c2</code></a> (redis) - redis: add redis persistence</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/de5d7538e64ec86c2d7393dfab922dfe66d29bde"><code>de5d753</code></a> (redis) - redis: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/f6446395fbf46fd644ce3b12a3b5996e7a5b66a2"><code>f644639</code></a> (redis) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/98051d20ecb8f946c8e5093b50791df77494da52"><code>98051d2</code></a> (redis) - redis: premission denied</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/bcb548eca8ae83d1f828bd47e190b6f78a919635"><code>bcb548e</code></a> (redis) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/524aa412e589ed21c61e31ad03067f8b96a0e116"><code>524aa41</code></a> (redis) - redis: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/26c946651e503cf3be26225010fcf67a646e8c27"><code>26c9466</code></a> (redis) - redis: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/b67d7a25db6484862676b57d89530f5de4cd254e"><code>b67d7a2</code></a> (redis) - redis: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/839ec50c7c473dcac3fc2fb7e0a51a3493b3db62"><code>839ec50</code></a> (redis) - redis: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/237ca86c239a392e23ce9b7ce68bcf9d1d0da27f"><code>237ca86</code></a> (redis) - redis: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/bdd968d27a01a06110ac394fcb4f7893cfb0edc1"><code>bdd968d</code></a> (redis) - redis: upgrade neew require</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/8b2910f10b7f5b6da8828bf8558f4eb373fcc238"><code>8b2910f</code></a> (registry) - registry: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/eedbe78543bf04298134ee2900b21d9218fd99e5"><code>eedbe78</code></a> (registry) - registry: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/024161578b010ad70702ae9480cb07a9b210ca61"><code>0241615</code></a> (registry) - registry: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/9b58da4298fd28f3ca060ce2ffd11a0977b755e1"><code>9b58da4</code></a> (registry) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ab6acb71f85990865cd4322ef21e3d2ae0903ac8"><code>ab6acb7</code></a> (registry) - registry: change workdir to /workspace</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f368bf7d7dfb8357acc8bf5019d052057dba393e"><code>f368bf7</code></a> (registry) - registry: use DRYCC_UID DRYCC_GID env</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f4b9041f9c18721dcfc71091a89145323c5fc092"><code>f4b9041</code></a> (registry) - registry: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/c2e87ca32c58633e9f86b3422d48249b3c1d81a8"><code>c2e87ca</code></a> (registry) - registry: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/feb6aba75f16044ecd927e020372338cd6ddf519"><code>feb6aba</code></a> (registry) - database: bump mc 2022.04.01.23.44.48</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/956932b04720266b896c0ea150a595c77a513444"><code>956932b</code></a> (registry) - rregistry: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/deda8d8d7868938fa890b5e7a0f22911e7151837"><code>deda8d8</code></a> (registry) - registry: move registry-secret.yaml from workflow to registry</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f52c7bf6e4bc23d4f7b4e78224ff2d8da81198bc"><code>f52c7bf</code></a> (registry) - registry: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/007fe03a89f5e3b6d9baeda0b3fea84041a46ea4"><code>007fe03</code></a> (registry) - registry: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/d620c6db554f29b6c9b044c12b5dfd62194f274b"><code>d620c6d</code></a> (registry) - registry: <a href="https://github.com/minio/minio/issues/13799">https://github.com/minio/minio/issues/13799</a></li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/85e6b732126ea2dacb4db0d79b2fbb831b0d984a"><code>85e6b73</code></a> (registry) - registry: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/6a1155d75f7d6007f7ef3fe2c947423567c20e65"><code>6a1155d</code></a> (registry) - registry: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7b8ebae5738c401580391a631757fa4646a31f3c"><code>7b8ebae</code></a> (registry) - registry: change minio to storage</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/13389519866129557fe9e08b446eb3a3de163a71"><code>1338951</code></a> (registry) - registry: add check storage health</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/2fa769dcfb770b1f9789e3ab13f96380f3e708c6"><code>2fa769d</code></a> (registry) - registry: change probe</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f187cbf22c9206693656df844e2f97007dd95574"><code>f187cbf</code></a> (registry) - registry: add replicas</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/09d8a7b3cc69d6e0f90ab19b727f54b7129a3ae5"><code>09d8a7b</code></a> (registry) - registry: upgrade to mc 2022.08.28.20.08.11</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/4b187b8d076ef387b667e0807081021184c1f55f"><code>4b187b8</code></a> (registry-proxy) - registry-proxy: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/29ffbbe58737a14432a69938c69ff54c056b7f85"><code>29ffbbe</code></a> (registry-proxy) - registry-proxy: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/6d783baa4be1de057980040830fd6d3b161347a8"><code>6d783ba</code></a> (registry-proxy) - registry-proxy: remove use_cni</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/8cf05cff7cb44bf0b0f5c94e76567607d2f9adef"><code>8cf05cf</code></a> (registry-proxy) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/090e28647345560182a8f21da8f9445d567e3c73"><code>090e286</code></a> (registry-proxy) - registry-proxy: chore(imagebuilder): change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7cf6120e818b9a12799a305d8d17dfef8746a9b1"><code>7cf6120</code></a> (registry-proxy) - registry-proxy: use DRYCC_UID DRYCC_GID env</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/3a00697ed5de2230fc98971798d16de4ac6ceccd"><code>3a00697</code></a> (registry-proxy) - registry-proxy: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/30e69e8ca26894cc9efcd206665c5d96aa198085"><code>30e69e8</code></a> (registry-proxy) - registry-proxy: add registry basic auth proxy</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/942abce928797f2a77883f3a6a1a6720a6774c34"><code>942abce</code></a> (registry-proxy) - registry-proxy: upgrade to nginx 1.23.1</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/5ea3297285ab826c6686bcd20c34b1dd178615f6"><code>5ea3297</code></a> (storage) - minio: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/8306addad83bf486ae0d796d85b8f5593ca22ef7"><code>8306add</code></a> (storage) - minio: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/c917e9f3e1b03d0c9557f41f753c05f5d48f60df"><code>c917e9f</code></a> (storage) - minio: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/042c73208b255364db2cc08374a7b9ba39946edf"><code>042c732</code></a> (storage) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/7b47b82f903ecd1e6f6c1a30ed856f7153eaef20"><code>7b47b82</code></a> (storage) - minio: change workdir to /workspace</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/6f3531ef29ed032f3f0bcbc09211e9030a02340a"><code>6f3531e</code></a> (storage) - minio: use DRYCC_UID DRYCC_GID env</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/9795fb1c71641cd106dc06abeb355c8479b0a351"><code>9795fb1</code></a> (storage) - minio: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/a7b09c5b264fa9ce068ae06b12ac5fec6e7a63d4"><code>a7b09c5</code></a> (storage) - minio: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/76073428fa40f6048482594720707c1e92ca17d5"><code>7607342</code></a> (storage) - database: bump mc 2022.04.01.23.44.48 and minio 2022.04.01.03.41.39</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/ea2b2f15ffc2c4d263e537aa14a74f9c71a450cc"><code>ea2b2f1</code></a> (storage) - minio: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/445b50100629f5799b4137fa5d71a4768836f8d2"><code>445b501</code></a> (storage) - minio: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/f19fbc75f98c5f1349bdfe098c69bdf732a10886"><code>f19fbc7</code></a> (storage) - minio: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/8982e2eab58a059040d483c4ac373e9ccced0765"><code>8982e2e</code></a> (storage) - minio: use minio to distributed</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/06bec7372476dec97304f51754a9c031498fd888"><code>06bec73</code></a> (storage) - minio: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/9b8f0062892bcd4f720014a142efde4ce6ed10c6"><code>9b8f006</code></a> (storage) - storage: remove assert</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/59d64b92e21603e86573699e5b1e2914672cfe3a"><code>59d64b9</code></a> (storage) - storage: change listen to POD_IP</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/60044ee012378c0c344518f5945ed6dace124535"><code>60044ee</code></a> (storage) - storage: add juicefs mount options</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/189f944175bd9c16d3a8d5347a9040143903e15a"><code>189f944</code></a> (storage) - storage: remove volumeName</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/302fe8964b3171bc6c7cdddd494d5e3ca62c5209"><code>302fe89</code></a> (storage) - storage: mv to minio dir</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/6ec586d742cf14f311e2ac097ad207c2b3fb65b4"><code>6ec586d</code></a> (storage) - storage: change readinessProbee andlivenessProbe</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/0e028dfee98c4cf8a54110101f1084b03cf75b8e"><code>0e028df</code></a> (storage) - storage: add minio pdb</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/cf9bd2de2b8138b6a75c1d804e919586d2d53eca"><code>cf9bd2d</code></a> (storage) - storage: add check storage health svc</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/2dd5c9f20dcbbdb184d3e0be19a9e93b41ac1019"><code>2dd5c9f</code></a> (storage) - storage: add volumeBindingMode</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/fa2effc313905bf8e7a0d41d6d09335ca1a70552"><code>fa2effc</code></a> (storage) - storage: remove databaseBucket</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/d166cc721e45bf1955a2d99b70187ee9b3d6970a"><code>d166cc7</code></a> (storage) - charts: format network-policy name</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/d06bcce9fe0e8de7720e5c93b5d87e742be7f5a7"><code>d06bcce</code></a> (storage) - storage: upgrade to golang 1.19</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/c2ca05cd4b92259d4454723ab25252e4f6e220ac"><code>c2ca05c</code></a> (storage) - storage: upgrade new require</li> +</ul> + + + + + + Blog: Drycc Workflow v1.5.0 + /blog/2022/10/06/drycc-workflow-v1.5.0/ + Thu, 06 Oct 2022 00:00:00 +0000 + + /blog/2022/10/06/drycc-workflow-v1.5.0/ + + + + <p>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.</p> +<h2 id="workflow--v140---v150">Workflow ## v1.4.0 -&gt; v1.5.0<a class="td-heading-self-link" href="#workflow--v140---v150" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>passport v1.0.0</li> +<li>rabbitmq v1.0.0</li> +<li>imagebuilder v1.0.0</li> +<li>builder v1.2.0 -&gt; v1.3.0</li> +<li>controller v1.3.0 -&gt; v1.4.0</li> +<li>database v1.0.2 -&gt; v1.1.0</li> +<li>fluentd v1.1.0 -&gt; v1.2.0</li> +<li>redis v1.1.0 -&gt; v1.2.0</li> +<li>influxdb v1.0.1 -&gt; v1.1.0</li> +<li>logger v1.1.0 -&gt; v1.2.0</li> +<li>minio v1.1.0 -&gt; v1.2.0</li> +<li>monitor v1.1.0 -&gt; v1.2.0</li> +<li>nsqd v1.1.0 -&gt; v1.2.0</li> +<li>registry v1.0.3 -&gt; v1.1.0</li> +<li>registry-proxy v1.0.2 -&gt; v1.1.0</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0f5f8e4171313ea56de2d659d92458acd39a3201"><code>0f5f8e4</code></a> (builder) - builder: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f269d06ddc42464ba99ceeabc283645778034547"><code>f269d06</code></a> (builder) - build: add buildx supportjkjkk:q</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5e72fe88f057c1814c6d8075638d124445c16157"><code>5e72fe8</code></a> (builder) - registry: use docker build</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/25d8a4cbc14ccfeccc0a33d17fc723149103a0d3"><code>25d8a4c</code></a> (builder) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7a3e1c58942dfdfde474462f92a2a5bddf1c15a8"><code>7a3e1c5</code></a> (builder) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/46b75ff211da2985ce17737e7c6bb29ce73c8df3"><code>46b75ff</code></a> (builder) - builder: add cloud native buildpacks support</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2db2054dd960f80ee76c442d3705490c5f70358a"><code>2db2054</code></a> (builder) - builder: unified build model</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/4b7f9d9bc38c65ca56e162701b4cbce43c1cbbbe"><code>4b7f9d9</code></a> (builder) - builder: add initContainers</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b78c936ec706cce8bd8e8676a411187fed658b23"><code>b78c936</code></a> (controller) - token: add get token api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bac52a51b06872d48ecefabfb14b29b9f70d4357"><code>bac52a5</code></a> (controller) - tasks: use celery replace nsqd</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b9b0c58b1f877d077543efb202c71f5cec07b6fc"><code>b9b0c58</code></a> (controller) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/205dcb3b5b1003d704a0033d3a3b8b6761393df9"><code>205dcb3</code></a> (controller) - influxdb: add influxdb client</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ff15849bafddc47e06820ca89e8e95abc6c89311"><code>ff15849</code></a> (controller) - influxdb: upgrade to influxdb 2.x</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4016244757d764b553abd20ffb8ed79368c7caa1"><code>4016244</code></a> (controller) - controller: push data to influx</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/fcfce2ea7f6af657c46a1c53f0f78b7224b56ff6"><code>fcfce2e</code></a> (controller) - workflow-manager: add workflow-manager support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/00e9bfb627c11be35fd57c330d3127c84675b0f6"><code>00e9bfb</code></a> (controller) - influxdb: review influxdb code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/dd644d5a5e626d51ddb6f4d6488691ac7f2f2804"><code>dd644d5</code></a> (controller) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/118278b332877428f09d13801432a8c7f51ebbee"><code>118278b</code></a> (controller) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/122a9cd267f8b80d4b922938b97a71032f174648"><code>122a9cd</code></a> (controller) - oauth2: add oauth2 support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/559a5b6c76a0b9925bdd7d027e5653b7d494d4ac"><code>559a5b6</code></a> (controller) - controller: use cncf buildpacks replace slugrunner</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/96130e6900dae2bc31899e3a06fec87c5c6684c9"><code>96130e6</code></a> (controller) - charts: database configuration optimization of passport and controller</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2ea85089f9ef7814e7c504380929c09cd73fadb2"><code>2ea8508</code></a> (controller) - oauth: using passport authentication</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/868c437940b7cde4caaf0b4f81ab5265cd2f197c"><code>868c437</code></a> (database) - database: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/eadd5da76c3a5979a90b52b245dc9041da861d6a"><code>eadd5da</code></a> (database) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/b6eea4c09dcd95d7f8f0540c2ffef63567146167"><code>b6eea4c</code></a> (database) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/04a88dbafe96027068badd9e65c30b832432c371"><code>04a88db</code></a> (database) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/92ed309894ef2d065d4dc20acf5cf44dfafa84d7"><code>92ed309</code></a> (database) - database: add initContainer</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/ee6b78ff78bfe978edf2e9a9789bdf58c2dc846f"><code>ee6b78f</code></a> (fluentd) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f523e30c5e93d80e509232e7bb25f4de92267312"><code>f523e30</code></a> (fluentd) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/ee47b53b6f18bf4e2cdd41aaabf4dcd807d4b2d7"><code>ee47b53</code></a> (fluentd) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/80a51af1c0dbf689ead41a4b88d5e31861a7b0d0"><code>80a51af</code></a> (influxdb) - influxdb: modify influxdb naming rules</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/fb1003086e3819ada293e1792b46e966e509ee3a"><code>fb10030</code></a> (influxdb) - influxdb: use influxdb v2</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/0e87ad8c239a8cbb4ec02a584081ac1be0cb21af"><code>0e87ad8</code></a> (influxdb) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/9d108019d94ce2e653ec16482e89dff314810f9b"><code>9d10801</code></a> (influxdb) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/d825c9f7b4198c10e93abc7121af54f7af63f711"><code>d825c9f</code></a> (logger) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/b1395766670636ecbb42fb0b4ca1649186bfd4c5"><code>b139576</code></a> (logger) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/88f84ea95e334fcfef45ecd4f28c8bc468523574"><code>88f84ea</code></a> (logger) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/5ccae3ef8fa0894f08bf6ba552b17455a481a698"><code>5ccae3e</code></a> (logger) - dockerfile: remove chmod cmd</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/193aefc8c4106c7c6d5022c9183c68d6e604e735"><code>193aefc</code></a> (logger) - logger: add initContainers</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/baee3305a3b09a0fba83f33fb161400a7e7fd7fb"><code>baee330</code></a> (minio) - minio: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/ad5d055e170977801a6951813e4896d1f854e14f"><code>ad5d055</code></a> (minio) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/19868d457852e423536d8ae8f426a2c3437f423d"><code>19868d4</code></a> (minio) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/4bd84b8bb8af65a0ab05eff3a4c227452c4a3a2f"><code>4bd84b8</code></a> (minio) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/79d1f2f85c17c71ec609e8e191e04e9de87deec0"><code>79d1f2f</code></a> (monitor) - database: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/88e5a7f45886f5ca947e44052c5c52a2f8e17497"><code>88e5a7f</code></a> (monitor) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/5672e99a81ce856e4cd42a1b4e1083919e165272"><code>5672e99</code></a> (monitor) - influxdb: modify influxdb naming rules</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/867210310f29da9600bb2d052e05d5181cfe5a4f"><code>8672103</code></a> (monitor) - influxdb: use influxdb v2</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/66cb4c877ee0acfdcabab284da18b58266b61201"><code>66cb4c8</code></a> (monitor) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9576eb38c61048d3d540303047c8690763d664e1"><code>9576eb3</code></a> (monitor) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/30809c9ce3f31f52ac10616dbe9a24135d74828d"><code>30809c9</code></a> (monitor) - monitor: add initContainers</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/70d140ce05b061462a990029b9fd7ac749c383c7"><code>70d140c</code></a> (nsqd) - nsqd: using self compiled nsq binary</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/1073d4f35b082ea6dd63570d8427d7e3d1c2fecf"><code>1073d4f</code></a> (nsqd) - nsqd: use GOPATH replace /go</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/e49848037b54362f83ee063adc6e954afe8fa84a"><code>e498480</code></a> (nsqd) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/cf9b7d5cd6ee63d77acadec5c3a410acb60df400"><code>cf9b7d5</code></a> (nsqd) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/c335856f1ca9c80b0dc23df3445d395a13b8b50b"><code>c335856</code></a> (nsqd) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/efba7134453bc730b968d909089564de3de3079a"><code>efba713</code></a> (redis) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/c7a3b53025faa393bf6e915ec71b96ef7a5da27f"><code>c7a3b53</code></a> (redis) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/4cdad7bab726dd11973c1dbc643a81eb6313ba1f"><code>4cdad7b</code></a> (redis) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/652b443a4e5c54765bb40cfeb38310eee455a3c2"><code>652b443</code></a> (registry) - registry: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/4060176efaca5531faec4ecdd02eb30b6451e16e"><code>4060176</code></a> (registry) - registry: use docker build</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7102a03677830beb4b0ad093b141cb48ba948dd7"><code>7102a03</code></a> (registry) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/6c8600d293589b36748acf7b4dfb913f2cefde8d"><code>6c8600d</code></a> (registry) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/33a51c99e3f278c7c36dfc27c124db3dec530914"><code>33a51c9</code></a> (registry) - registry: add initContainers</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/bef70dc98c4b044d1108f6b42f439b36d37270e1"><code>bef70dc</code></a> (registry-proxy) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/d2319c1fce4e57cd9257ec3978f4e5a8d0101a23"><code>d2319c1</code></a> (registry-proxy) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/02fafed2b1b5648274c3d44c3d113a0a025e4fca"><code>02fafed</code></a> (registry-proxy) - charts: set the default chart version</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5499c9a2844c192285d5afdbf6a08d803a70cf8d"><code>5499c9a</code></a> (controller) - gunicorn: gunicorn not running</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/06e9e8869fbf61b3db753ab211bd9d465afa9058"><code>06e9e88</code></a> (controller) - controller: error loading shared library</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/01b5bd04cf1848b876b2b5acbeae6c361bebf975"><code>01b5bd0</code></a> (controller) - controller: upgrade celery config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6e32d55cf9de3dce1b7d470f850c2d155809cc07"><code>6e32d55</code></a> (controller) - controller: fix update resources bug</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0e0d53f3056dfbf427ad7a474786e723b87cb39c"><code>0e0d53f</code></a> (controller) - chart: set the domain depends certManagerEnabled</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2ac4ca839d76a4b80205506938d63f25bb4abea0"><code>2ac4ca8</code></a> (controller) - passport: error loading shared library libexpat.so.1</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a0dd517e189a2ba9472c0d320ba32d091520dcbe"><code>a0dd517</code></a> (fluentd) - fluentd: drone build</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6eca2a3e17e2965816718963fe4d7f6ffeb15a42"><code>6eca2a3</code></a> (logger) - logger: golang lint</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/63b0aa0989db8f9e15daa415c5a0b56e9350c0a9"><code>63b0aa0</code></a> (registry) - drone: charts url error</li> +</ul> +<h4 id="docs">Docs<a class="td-heading-self-link" href="#docs" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/472cfcc226c98d2b9a74c367519d57ec31890b71"><code>472cfcc</code></a> (controller) - controller organize README.md document</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/d9d6e292c602c3538784de6755b40f4655710278"><code>d9d6e29</code></a> (redis) - redis: delete links that do not exist</li> +</ul> +<h4 id="test-case">Test case<a class="td-heading-self-link" href="#test-case" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1468f57465243709594b0d6472636ccc0d7b7f62"><code>1468f57</code></a> (controller) - controller: add command unittest</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9999bfd30ab9550966eb70a6e52efbbb38f5cef1"><code>9999bfd</code></a> (builder) - builder:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/cda8b5814e507ab72a0ce7125eaa8d6bdd168a06"><code>cda8b58</code></a> (builder) - builder: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/dc575dde93ad1334be9d1337fbc1b0b66a06ebd9"><code>dc575dd</code></a> (builder) - builder: use imagebuilder replace dockerbuilder</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d3bb183df646a7f2503c739633bb6d5d61778219"><code>d3bb183</code></a> (builder) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5fe34d1fee978986729120af7d5732ed3759b88c"><code>5fe34d1</code></a> (builder) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7e364532bf841109fe5e75c6a5c357ad46f7c4b7"><code>7e36453</code></a> (builder) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/52b8d9df26f28e562b4eca72e777106db86db9db"><code>52b8d9d</code></a> (builder) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/65963f4b35d2b60e376818d314cd203fb698eaba"><code>65963f4</code></a> (builder) - k8s: add privileged to dind</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d345fcf23f1c3e755ec646d988c5d1e0e90d2eba"><code>d345fcf</code></a> (builder) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7975c998252a66557bbfa774ac18f18e17a5ddbd"><code>7975c99</code></a> (builder) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/59633dd9197fed8400d8007cc93e7a62404e92b1"><code>59633dd</code></a> (builder) - builder: modify launch imagebuild pod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8d14e67e5e84c2d6b6254b7704219c9ed38aac67"><code>8d14e67</code></a> (builder) - builder: use Procfile in anywhere</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5357fa88e56ef24fac7f8d3dc0bfa5d990c1be58"><code>5357fa8</code></a> (builder) - go: bump go mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8d26ac054edeb67e4ce473507a96951dbda10db2"><code>8d26ac0</code></a> (builder) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0af620def4db8473c799c9499a4a27ee4a278210"><code>0af620d</code></a> (builder) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ae84303f6d15b22c525e62cf3ae2d1e314d9a67b"><code>ae84303</code></a> (builder) - builder: run imagebuider replace pod with job</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/3b2c496a00a8512731c18d79215ce9e279b60e19"><code>3b2c496</code></a> (builder) - builder: change docs website</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5679a4cfefd214b7bb0014cde3f7c461bd70ca91"><code>5679a4c</code></a> (builder) - builder: upgrade to golang1.17</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a214503452b10f3e265d97954964d321480b007d"><code>a214503</code></a> (controller) - controller:replace whitelist with allowlist</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/375ddcc15761326b8c74f8cd78a239cfe9c14224"><code>375ddcc</code></a> (controller) - ps:drycc ps:list show autoscale num</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c32e409b6fe09c533bc5cfdbf35b47e633d2a644"><code>c32e409</code></a> (controller) - ldap: canot register when ldap is enabled</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c46580a6264cbe21ee5240fde5791c9c78ef2a19"><code>c46580a</code></a> (controller) - controller:modify redis config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/fa9e87b6131a9669eebafb4bfea26dc5f15bde64"><code>fa9e87b</code></a> (controller) - chart:modify controller charts</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6f9fd081e6826fd89316ff4d064c9cf03501e1d3"><code>6f9fd08</code></a> (controller) - nsq: remove nsq</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/994b2dc68afdeaedc540525422183565bc1e3230"><code>994b2dc</code></a> (controller) - docker-buildx: add check-docker</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a720c3a9933aaaa15d5933143708fbcac2d5233a"><code>a720c3a</code></a> (controller) - controller: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e9a5c843d0abd85ae57d8cb87cbe7369364b07e6"><code>e9a5c84</code></a> (controller) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a26614acb4fb8cef5030e0e56681939977a7a266"><code>a26614a</code></a> (controller) - controller: add rabbitmq env</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3df229d2d31b6f8fc79a260e5088a86d00716459"><code>3df229d</code></a> (controller) - controller: modify database config &amp;&amp; remove redis port config &amp;&amp; add env prefix with DRYCC</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/257e94b429c8f7b0c636a083215d9709baaf5c8d"><code>257e94b</code></a> (controller) - controller: CELERY_BROKER use rabbitmq and modify celery-deployment cronjob</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f4d6ec343ec3fb618ef9ee8da09474294d49807e"><code>f4d6ec3</code></a> (controller) - chart: pretty chart format</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/63e61951cda276fe59a91a64a7b84f7feb66ce6d"><code>63e6195</code></a> (controller) - influxdb: modify influxdb code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0f6d408734984e4ec9bbc56c0a4b68ba5783b680"><code>0f6d408</code></a> (controller) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/87bad28b65b773e6534c4cc8e2128045d3ffb7c3"><code>87bad28</code></a> (controller) - python: upgrade to python3.9</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e8f75603cd0cd38423d774f1b3220b64ef9eb6dd"><code>e8f7560</code></a> (controller) - volumes: modify mount summary</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6cf6c6bdbf029b1e52a36d5148d5a025fb6d04c1"><code>6cf6c6b</code></a> (controller) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a9397e8c06a69d5539e8f5b67be242932e69c2c8"><code>a9397e8</code></a> (controller) - oauth: modify token Authentication</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c7f8c8b3b2294205603afd9ca4a7ba2e3f6cea02"><code>c7f8c8b</code></a> (controller) - deps: bump django from 2.2.14 to 2.2.18 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a1a08aa4165ba678e979d6ca4477694999d0e5b8"><code>a1a08aa</code></a> (controller) - deps: bump djangorestframework from 3.11.0 to 3.11.2 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/efd78b42038a404d53d06e92bb609cc7f97739db"><code>efd78b4</code></a> (controller) - deps: bump django from 2.2.18 to 2.2.20 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/649b044c644c9729b80e5f0e2663779bcc648ef2"><code>649b044</code></a> (controller) - deps: bump django from 2.2.20 to 2.2.22 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/41b742bbec9370490b0176fac407bcbd83abd2ed"><code>41b742b</code></a> (controller) - deps: bump django from 2.2.22 to 2.2.24 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/22ffe5d8dd51cffc38e5e3757ac97eba02861e2b"><code>22ffe5d</code></a> (controller) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c98b46837efa85a5daf46c6dc40d45606b7548bc"><code>c98b468</code></a> (controller) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/20e6edb1001fb709ea877349771404ee807ae36d"><code>20e6edb</code></a> (controller) - chart: modify the problem of using buildpack</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/db16879a4ce64c7020b7622603f53ef88898be0a"><code>db16879</code></a> (controller) - controller: pretty pods list print</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ba6f456ddb0a48a0e8c1f446330a838ba27b8f48"><code>ba6f456</code></a> (controller) - test: pretty pods list print</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5fce4b7a77c91836d921c6d1f4cb8cacb2ab953d"><code>5fce4b7</code></a> (controller) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e9e0bcb36d4b6b1169446c484357260aee7feba7"><code>e9e0bcb</code></a> (controller) - oauth: using passport authentication</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0311172bea0f1d28959ee528c0e50493d0c8d425"><code>0311172</code></a> (controller) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/150eff1c246b908e8f5521cc1e5e9ff4c765433d"><code>150eff1</code></a> (controller) - charts: update cert-manager api version</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/de8545a568984f52e5757806d9ce631864285fed"><code>de8545a</code></a> (controller) - controller: update requirements</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1442207889955cbf230bd1c87867acaab72256fb"><code>1442207</code></a> (controller) - controller: using django native JSONFiled</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ab4e836a55aa61cbdb222a8fc606b5619625337e"><code>ab4e836</code></a> (controller) - oauth: modify passport api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5c54e0642c76bfa1253397177b5aef2dc28dc611"><code>5c54e06</code></a> (controller) - controller: eliminate pip warnings</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/870328ddf06ab6b3004fd0e56516de6496c06e26"><code>870328d</code></a> (controller) - controller: remove entrypoint</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5e5e6ae5763333989e153119c6078c06788d0f78"><code>5e5e6ae</code></a> (controller) - controller: upgrade celery config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/607778ffb2f81b74457db2b34952a0cd01647eb3"><code>607778f</code></a> (controller) - controller: add initContainer</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/23dc016da2419237814a7d1ac54435adc99f0423"><code>23dc016</code></a> (controller) - chart: set the domain depends certManagerEnabled</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f3cf20b610a649d105e4889212272604615ddfa7"><code>f3cf20b</code></a> (controller) - controller: remove default bash env</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/73f26364110a1cdee5bdfe868e4fbf0be2cdbcf4"><code>73f2636</code></a> (controller) - controller: modify alpinelinux repositories</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/498e9f2fbd5470ff8079e09eacc04be4272d9601"><code>498e9f2</code></a> (controller) - chart: change certManagerEnabled to boolean type</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/27f5308938f972d078e78c539e9160cc2f3b3a1a"><code>27f5308</code></a> (controller) - passport: exclude cryptography</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/370b75dc9cbdcf24b3955b562ff276e3214eb5a2"><code>370b75d</code></a> (controller) - controller: use sh env</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/07585b4f45471b22e6942590dac51cf724e8bd57"><code>07585b4</code></a> (database) - postgres:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/20172dcfac8370b389aa26a30cc9e2f0a96f6a6d"><code>20172dc</code></a> (database) - database: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/abb9b88a96e0098d3fb1128d123825ca4faea3a4"><code>abb9b88</code></a> (database) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/e72f58ffa50be0f5170423529292872fcd53cfea"><code>e72f58f</code></a> (database) - chart: modify the off-cluster database</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/a91f64f694c15143b7210597ffdd7dacfa6668bf"><code>a91f64f</code></a> (database) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/614fb76a1c77b8f5697a87aadfd094d6eaa8c27b"><code>614fb76</code></a> (database) - tests: use add-host replace link</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/a3428f353c38f440381890fd80416ad302033352"><code>a3428f3</code></a> (database) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/239fef11f87655203f6090e55259cb09906fb253"><code>239fef1</code></a> (database) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/42858e1e2ae1a09e1bad75e1fabb7ec4115e7197"><code>42858e1</code></a> (database) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/d0fe85094eb305ce071f51bf40bdf2099b88ea13"><code>d0fe850</code></a> (database) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/34a36ad4f650d6eaf2320e55f4d80a06e0dd1675"><code>34a36ad</code></a> (database) - charts: Nn secret is generated during off-cluster</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/064ccf462a1bd2fe513809c39919fc1ccaba7801"><code>064ccf4</code></a> (database) - database: create database</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/9228992327543f008bf4158be8b8cd1777c3ba90"><code>9228992</code></a> (database) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/9f7810c6dcf6323bc6f75345f4c9fc25a5e11ef6"><code>9f7810c</code></a> (database) - database: upgrade to wal-g v1.1</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/05783f4118cd7e8cc80e41c20656f5b16961fa3d"><code>05783f4</code></a> (fluentd) - fluentd:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/0739809ba68d12ef8940f0f6addcfea7353885f5"><code>0739809</code></a> (fluentd) - influxdb:replace monitor-influx with influx</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f02487cea73f20a2039fe6c1960950a3b73107b5"><code>f02487c</code></a> (fluentd) - fluentd: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/2c96cc089f7965286409cb4d710df5ab947b20b5"><code>2c96cc0</code></a> (fluentd) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/b20c429b9ace293c7add60fa350098b91285bf87"><code>b20c429</code></a> (fluentd) - charts: remove port config</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/6dd019721438cf32f2262bdb76d74da9ab5b37a3"><code>6dd0197</code></a> (fluentd) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/c5bec512a902662a8200639b3b574925c836e734"><code>c5bec51</code></a> (fluentd) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f8524b78536b6d6cc1022e3cfa6ab61ac36fbca8"><code>f8524b7</code></a> (fluentd) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a50878aabea91b3fbbafaf9c1f43c2eca7fe5a5c"><code>a50878a</code></a> (fluentd) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/14fe20e811ba3c8814188dcec18ed69c169c4b9d"><code>14fe20e</code></a> (fluentd) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/4a2f66070910abcc3068d0e03a8e52d1e5d2659d"><code>4a2f660</code></a> (fluentd) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/de2dd9178130101f4b0c5ed82d5e80a1ba4dd591"><code>de2dd91</code></a> (fluentd) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a9f1944c3dcac5e8f0eb2f44d11ec81517735b8c"><code>a9f1944</code></a> (fluentd) - fluentd: upgrade to fluentd1.14</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/7cb4e954704cfa5ff37d3b95b5e9a231188f4264"><code>7cb4e95</code></a> (influxdb) - influxdb: change username to user</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/0fdc21b2a95003abd488cb05b640ec1fa1db3ff7"><code>0fdc21b</code></a> (influxdb) - influxdb: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/b2acddb8d72bd0e17fb0b543a8f98e2fa5d57735"><code>b2acddb</code></a> (influxdb) - influxdb: change default path</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/ba8891910d5ef9084f9dd9b7569d905e19f056ea"><code>ba88919</code></a> (influxdb) - influxdb: add check_env function</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/91174010ed68356d9b813b70e2def18af9ed5186"><code>9117401</code></a> (influxdb) - influxdb: modify init_influxdb has_bucket</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/092a3e6b96e9494f00e7a0627b2aa9ce1212c7d4"><code>092a3e6</code></a> (influxdb) - chart: pod not readiness</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/51de380cc83177be8bdb557894b9fd5c28ed0a3d"><code>51de380</code></a> (influxdb) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/66d76679cc55578d13274fa5bf0e653b258e57b4"><code>66d7667</code></a> (influxdb) - docker: replace influxdb base image</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/3aa30943cea519fff18c23264c99c226cfb43c80"><code>3aa3094</code></a> (influxdb) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/14b9c24f110297e5b6a632ce4ad94625f5663038"><code>14b9c24</code></a> (influxdb) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/02b4cd111c092393b0f2d3f1c1654d0476603b03"><code>02b4cd1</code></a> (logger) - logger:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/114b5d5392a1d82f8dc73b4b1527e742fcaf22f1"><code>114b5d5</code></a> (logger) - reids: delete the logger prefix of redis</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/639278a8f055d7872491db2240f4327d4f77114e"><code>639278a</code></a> (logger) - redis: remove logger from redis conf</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/90195e27521b44e0d43f8fb7ff9ab9a658f60676"><code>90195e2</code></a> (logger) - go: remove GOOS and GOARCH</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/31e2e27f9160e62b199c196972fe5c0097a78a22"><code>31e2e27</code></a> (logger) - logger: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/8fbd9fa7b119f112221be5fa5bdc21e3a891a6b9"><code>8fbd9fa</code></a> (logger) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/b39df2d46e0f625900f80d0103a5a35c4e7fbb0e"><code>b39df2d</code></a> (logger) - charts: remove redis\nsqd port config</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/35d6d0784df91dc1036928c83905052962a84ca0"><code>35d6d07</code></a> (logger) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/69aabf527a1bea60f6d7792a488ed074d138a27a"><code>69aabf5</code></a> (logger) - tests: remove docker link</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/e916644cd89379731f5a9990044e3f64d570b6dc"><code>e916644</code></a> (logger) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/d6872b7cfbd30d0be087270b581a0730961f4b8b"><code>d6872b7</code></a> (logger) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/37801daabfe98292c54ed2902aeb120069448b64"><code>37801da</code></a> (logger) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/cfb4b38897136e5c1b942433b52944cdccc9b195"><code>cfb4b38</code></a> (logger) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/8bda3bf9906424c9be8661ab0d6850ae6e3352ea"><code>8bda3bf</code></a> (logger) - go: bump go mod</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/e13ebfcd5fc940393e1d398623650bfcd31c24de"><code>e13ebfc</code></a> (logger) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/38e6d8d592ad42a176d08f0d7edbe38e55b39b72"><code>38e6d8d</code></a> (minio) - minio:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/d6925ddec232dd3b6187414f4a11327330baa95a"><code>d6925dd</code></a> (minio) - minio: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/d56bc39ba487c24e89a47e6c63375342ba3c3552"><code>d56bc39</code></a> (minio) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/e4696cc243711c53a1fe16051cd80209c8a3d281"><code>e4696cc</code></a> (minio) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/70c5c7988a513b5a39b92e442b0f9052d1507f67"><code>70c5c79</code></a> (minio) - minio: use latest version</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/773cf6c47a4ab539dcac29084980953bdd0e9e04"><code>773cf6c</code></a> (minio) - Makefile: remove DEV_REGISTRY ?=</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/5ce5bc696e7522107139cccfec37c6dc4b759059"><code>5ce5bc6</code></a> (minio) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/5da8be3ca9345e7a6c87ad61bf104b7345523691"><code>5da8be3</code></a> (minio) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/c1f0611fed4e73a5109f1d15901721fa968d6c34"><code>c1f0611</code></a> (minio) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/b73f7927c34fca39605e13930a06fad829658e7b"><code>b73f792</code></a> (minio) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/79d1c935ee59bf45af52a1265aa87e2ef3233f40"><code>79d1c93</code></a> (minio) - go: bump go mod</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/c448899edbaacf8d54cdbad53561733069c1020b"><code>c448899</code></a> (minio) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/15ee49ef85be819d3f6eed5dde4551ffa31f5fae"><code>15ee49e</code></a> (minio) - minio: migrate deprecated warning</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/9968a1a2095fecda1d3ba3fbd2263e83494d716e"><code>9968a1a</code></a> (minio) - minio: upgrade to golang1.7</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/14fedd29ba64e02c05b6cd5fb06bd261bf9f367b"><code>14fedd2</code></a> (monitor) - monitor:replace the special works</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/52c431ad1701cc15e03d55cbc436c5f4f7472522"><code>52c431a</code></a> (monitor) - reids: delete the logger prefix of redis</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/2c95b47a1f714a421be5860a78dd94c23ddcfdf3"><code>2c95b47</code></a> (monitor) - redis: remove logger from redis conf</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/da9bc5605eb4a118bca92fdff3cc49c2f208c040"><code>da9bc56</code></a> (monitor) - monitor:remove influxdb</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/53f47b9a3b8dec717d049b9be3961e4efd446381"><code>53f47b9</code></a> (monitor) - grafana: use grafana docker image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/5bdb188a7255e845cda8a49806053f12032d196d"><code>5bdb188</code></a> (monitor) - grafana: use grafana docker image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c0586dda982c857e61b89964f34b57028cfaa29c"><code>c0586dd</code></a> (monitor) - monitor: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/87d02b6c80ef04c1170e848e9febdb723c9503c3"><code>87d02b6</code></a> (monitor) - charts: add nodes and persistentvolumes rule</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/1b5598fb479f85808bb33ef29b8cd21ab9d40bc6"><code>1b5598f</code></a> (monitor) - monitor: modify grafana dashboard with FLUX and pretty config.toml</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/bcbc0d5b3ef1b16a9e4b22208f5c628156a556cc"><code>bcbc0d5</code></a> (monitor) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9418c9e13b4fb20f4174ee965044cf30ca12ae38"><code>9418c9e</code></a> (monitor) - monitor: fix upload dashboard error and modify INFLUXDB input</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/589f29a84eeab3f9fbc1cce1e49a601938a32987"><code>589f29a</code></a> (monitor) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f776f8a650fd4c0c1e5f21dc9aa38ad36ca5be72"><code>f776f8a</code></a> (monitor) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6ca306092ca874c666066dffce4f3f8fad11bbcb"><code>6ca3060</code></a> (monitor) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6a9ffb24264ff8d7e5e9407f811e5b38b9e20a38"><code>6a9ffb2</code></a> (monitor) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/45e41ed8d104205a708fd82327e0fa3f3ac3d97e"><code>45e41ed</code></a> (monitor) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/654d407bea3cc3e686416cb2f6e1224990bab741"><code>654d407</code></a> (monitor) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/41e9b9c3c1b371ea815cd480e33c53779c2211a7"><code>41e9b9c</code></a> (monitor) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/99c10d38471587b09fb51ee65c8e602e443b44e7"><code>99c10d3</code></a> (monitor) - charts: update cert-manager api version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9bf83c40a846784e8375db884a2d417073324408"><code>9bf83c4</code></a> (monitor) - oauth: user oauth passport</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/a128f6d5f97fc060a80a2384f4a2dd2dc916dd12"><code>a128f6d</code></a> (monitor) - chart: change certManagerEnabled to boolean type</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/8f897fe306e15f4d528d0665171d634f0d9b93c4"><code>8f897fe</code></a> (monitor) - chart: set the domain depends certManagerEnabled</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/ba6d793c6110993b227246b8bf0bb861fc468975"><code>ba6d793</code></a> (nsqd) - README:update travis build status</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/49879c4baba2a6824b9f32bb2734aec21debefb0"><code>49879c4</code></a> (nsqd) - nsqd: minimum git clone code</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/c5e26805e49bd1be880fd4857b435359a0840992"><code>c5e2680</code></a> (nsqd) - nsqd: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/21dd17b886aad7e673fdb72fe4ccce3d9786a623"><code>21dd17b</code></a> (nsqd) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/7d86b3cbb2452da48abcc99f165dfa8954f103bb"><code>7d86b3c</code></a> (nsqd) - charts: remove port config</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/c073d952af18ffd83b6f86ce7a55140b36029a63"><code>c073d95</code></a> (nsqd) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/55c297ca70952986cb6a971593bbe0e64adea029"><code>55c297c</code></a> (nsqd) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/165c2aef05413585886651299c11dfb741469b0c"><code>165c2ae</code></a> (nsqd) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/9c6a1f8eb363e1d09eaef29c97eff7b60053103b"><code>9c6a1f8</code></a> (nsqd) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/92830984c4627f1a034f8fcfcb490a09576aa960"><code>9283098</code></a> (nsqd) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/46acf8a349c2d8462ee2ec0b592bde8a26e5f459"><code>46acf8a</code></a> (nsqd) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/43caf8058c5c9b129744c1a191f234d3b44c793f"><code>43caf80</code></a> (nsqd) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/689747119e18e2f1151404beb1729cad9d6ea5f6"><code>6897471</code></a> (nsqd) - nsqd: use official image</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/297bc05baf835ffe4d103bb6cb7613aa1286be68"><code>297bc05</code></a> (redis) - redis:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/f5f8b5e75b99f11e20a1b3210e4c4a42e342df92"><code>f5f8b5e</code></a> (redis) - reids: delete the logger prefix of redis</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/af7b657e76bbc1201391fe3915e081bd220b96a8"><code>af7b657</code></a> (redis) - redis: change logger-redis to redis</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/8dca154e5ae4a38b42e1eb6e16e01f3e78d5fee1"><code>8dca154</code></a> (redis) - redis: remove logger from redis conf</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/eaeda2d2650c61768092ea7f5846733328e47dc6"><code>eaeda2d</code></a> (redis) - redis: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/53c6358e7fbaf02ec15d0a01afa5e02769e3bfb4"><code>53c6358</code></a> (redis) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/ae37416efe8b6fcfdfabf2d444bd241e7128d889"><code>ae37416</code></a> (redis) - charts: remove port config</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/e985656354c17c1221d8ec35007710e0b9d4f6a3"><code>e985656</code></a> (redis) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/423336a645aa3b5091b76e88e58b501357cc733c"><code>423336a</code></a> (redis) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/be64ab4c2fd6e1edd33ca8c5a4458c74bf6fa372"><code>be64ab4</code></a> (redis) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/3bec735f6849b5649c5a2416e8fdb76fb6c780d7"><code>3bec735</code></a> (redis) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/4f934f6ee96925b70463c660416706eafc21fc3e"><code>4f934f6</code></a> (redis) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/359b8780f014c1627a1290e32231cd53caf6f762"><code>359b878</code></a> (redis) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/83b8ac299c215de85e85485c6c0546bc25a37ab1"><code>83b8ac2</code></a> (registry) - workflow:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/869b280b55534a7fbd2dfc9052044cb487d97730"><code>869b280</code></a> (registry) - registry: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/999c1e936026b79dc0462da166998f3fa4cebec3"><code>999c1e9</code></a> (registry) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5652da941334dfdddbe2636d974e9d687b0d912d"><code>5652da9</code></a> (registry) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/cc8c6c2bc077bad277232d25bc536416dfa6c244"><code>cc8c6c2</code></a> (registry) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/c7bdbd0e67e6bcd35423db7d05aca99a511054ed"><code>c7bdbd0</code></a> (registry) - CICD: pretty .drone.yaml format</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5c55a38592dfd1a7356992018f15f022c02fdfc6"><code>5c55a38</code></a> (registry) - test: use add-host replace link</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f8866f3e6b4f94e15815e5f79b2adbebe3fd1ed1"><code>f8866f3</code></a> (registry) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/6c8292f9c65b38816fad79bf3f49ff54ad8760dc"><code>6c8292f</code></a> (registry) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/1d50f2ce75f708fd3b07b0c5d5dff2f4bdb8adc7"><code>1d50f2c</code></a> (registry) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/efbca6d2c99e2b170e945f050afa8fb139398a49"><code>efbca6d</code></a> (registry) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/2eafc592dc68c529a8a3a8077ef9d48916718079"><code>2eafc59</code></a> (registry-proxy) - registry-proxy: update nginx</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/071bd86ae3bef755f47e22aad54762a7f1e4c0f1"><code>071bd86</code></a> (registry-proxy) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/c72db9618ee6a73655b4b2c5e940ee9fc9447380"><code>c72db96</code></a> (registry-proxy) - registry-proxy: change travis icon url</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/63ffb920f62b692071fcbf825cbac55bbebe6598"><code>63ffb92</code></a> (registry-proxy) - registry-proxy:replace the special works</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/1d904a61de6cc38bfb071a965de09f5dea0d9996"><code>1d904a6</code></a> (registry-proxy) - registry-proxy: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/c8200b1f6f573dba0edb19509fdb56a8357828c7"><code>c8200b1</code></a> (registry-proxy) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/d3fa939d910c7b0c707f191b174d1fce89e4cdb6"><code>d3fa939</code></a> (registry-proxy) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/5a8b353fa642dbef5929d372ef4ce39657bd40fb"><code>5a8b353</code></a> (registry-proxy) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/703d05a7fa07fc8d5b4c5c4ca0fed8a1ee156536"><code>703d05a</code></a> (registry-proxy) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/aa71db189c6b489347d8f723bdf881bc0b0abf67"><code>aa71db1</code></a> (registry-proxy) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/710c1260065431acf427bdf7d6d6319024598852"><code>710c126</code></a> (registry-proxy) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/2dcc5e6c4b469cb74b56c8c1f0b69d1d5c58291a"><code>2dcc5e6</code></a> (registry-proxy) - chars: change org to imageTag</li> +</ul> + + + + + + Blog: Drycc Workflow v1.4.0 + /blog/2021/10/06/drycc-workflow-v1.4.0/ + Wed, 06 Oct 2021 00:00:00 +0000 + + /blog/2021/10/06/drycc-workflow-v1.4.0/ + + + + <p>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.</p> +<h2 id="workflow--v130---v140">Workflow ## v1.3.0 -&gt; v1.4.0<a class="td-heading-self-link" href="#workflow--v130---v140" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.1.0 -&gt; v1.2.0</li> +<li>slugbuilder v1.1.1 -&gt; v1.2.0</li> +<li>dockerbuilder v1.1.1 -&gt; v1.1.2</li> +<li>controller v1.2.1 -&gt; v1.3.0</li> +<li>slugrunner v1.1.1 -&gt; v1.1.2</li> +<li>database v1.0.1 -&gt; v1.0.2</li> +<li>fluentd v1.0.1 -&gt; v1.1.0</li> +<li>redis v1.0.0 -&gt; v1.1.0</li> +<li>logger v1.0.0 -&gt; v1.1.0</li> +<li>minio v1.0.1 -&gt; v1.1.0</li> +<li>monitor v1.0.1 -&gt; v1.1.0</li> +<li>nsqd v1.0.0 -&gt; v1.1.0</li> +<li>registry v1.0.2 -&gt; v1.0.3</li> +<li>registry-proxy v1.0.0 -&gt; v1.0.1</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fc7d93f718019cfae02b04c745470b4975c91a84"><code>fc7d93f</code></a> (builder) - builder: use go-dev</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0c2159e4a44f0c3f635dcee1b95afdd741d1935c"><code>0c2159e</code></a> (builder) - builder: fmt code and add create_bucket script</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1b88340205ac77e84ebba7a42215d7d3d40578a0"><code>1b88340</code></a> (controller) - controller: remove deprecated api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a92fdebab64716e4194653a9a17f1c00f70c882d"><code>a92fdeb</code></a> (controller) - routable: ingress support routable</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1e3eab3602538f266305a78c9244be466d685c68"><code>1e3eab3</code></a> (controller) - maintenance: add maintenance support for ingress</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/56b9dd0691c904bd75df928bace98830879eb31d"><code>56b9dd0</code></a> (controller) - crt: support containerd-ctr</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5fc3b46b2acd67af89590f1c7dd85fbfa5e989a6"><code>5fc3b46</code></a> (controller) - controller: add ephemeral-storage restriction</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d677e52c288431517de9ae4bddaaadbd1c8b976c"><code>d677e52</code></a> (controller) - controller: add a volume command</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5f1323a837c71127bb99fd8631934c5bd0cab2a7"><code>5f1323a</code></a> (controller) - controller:drycc run cmd add &ndash;mount para</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/74c36a51eef46ea1c110ee53472be632079ce5e1"><code>74c36a5</code></a> (controller) - tasks: add distributed async task</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/139c3ca9d01d7188c1a499dfffad7b7697e5fd0f"><code>139c3ca</code></a> (controller) - tasks: change nsq reader to async</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f237d74ca6344a5929c9b5089dae07a38c13753b"><code>f237d74</code></a> (controller) - controller:add drycc resource cmd</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/41b46d0653d39d0bdfb42907f7a0b9863bc20992"><code>41b46d0</code></a> (controller) - controller:add drycc resource cmd improvement</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c26f7d82e8fa6fcf4b45ab16fcb0298cb2880f6a"><code>c26f7d8</code></a> (controller) - controller: add LimitRanges support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/45b5d1b904abe94819c3dd306117dcd4e09123ed"><code>45b5d1b</code></a> (controller) - users: add users status api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4e16f9b86ac24b4c62d7d6fddb33278d1880dfa7"><code>4e16f9b</code></a> (controller) - ps:add ps:stop/start command</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c659fa9e058620fd8ce0ba4fcfc48898f1219f2c"><code>c659fa9</code></a> (controller) - k8s: add k8s cluster domain</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/31a625d71733b47944876ac3fb58fe55cd9b746b"><code>31a625d</code></a> (controller) - ps:add ps:stop/start command</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/00a779a5dbb60a33b621fae13b30a24e39ac55f3"><code>00a779a</code></a> (fluentd) - fluentd: support containerd log format</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f3f1bd42697f08340b6b6f5fbe161c5b6fbb31b6"><code>f3f1bd4</code></a> (fluentd) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/db7147c0e7556a655e185c6f00419f99aff4ed29"><code>db7147c</code></a> (fluentd) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/689c12eed60f53e1afbbcede91a5955360183fa7"><code>689c12e</code></a> (logger) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/78ccc5de7718b8f6fb1caf701d1b4ef72fc64362"><code>78ccc5d</code></a> (logger) - redis: add redis client cluster support</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/9843f2cf9d1d03511296bf7731b59d547bc10387"><code>9843f2c</code></a> (logger) - k8s: add k8s cluster domain</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/6ba122e8b6cbdf7b73785d21961056e6b9fc91ee"><code>6ba122e</code></a> (minio) - minio: add pvc support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/69735500c483f9144f461a2b8a3444e51ddd4dc4"><code>6973550</code></a> (monitor) - monitor: add ingress for monitor</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/cd733053287efbd12c29217cd47c6345c39457ce"><code>cd73305</code></a> (monitor) - charts: add volumeName support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/4769fe9e8d14bdbdca9447f9df23c67c09db2a45"><code>4769fe9</code></a> (monitor) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/87806df02cd84fc5feec304e9bc6e32996396b80"><code>87806df</code></a> (monitor) - k8s: add k8s cluster domain</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/4db40c4f129115019ef41c14df56a2d0092e9da1"><code>4db40c4</code></a> (nsqd) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/b6f3d4fe0f6bc8d3467fdebf21374bed378edf9e"><code>b6f3d4f</code></a> (nsqd) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/74b85bb9efdcba88a25a2734d512d07ef8068032"><code>74b85bb</code></a> (redis) - redis: change redis to statefulset</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/ff98b5018610d0e2be0ec5c03c7a11232199811a"><code>ff98b50</code></a> (slugbuilder) - slugbuilder: delete build hook</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/b201c2ff207eddac7327f75d698a77e89d4125a1"><code>b201c2f</code></a> (slugbuilder) - buildpacks: use drycc buildpacks</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0ec042db3c8a4db39088ffe381f518abdb55287d"><code>0ec042d</code></a> (builder) - test: fix test case error</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/4fb113b7351f9f02612b3e14b4d0787b77abb3b2"><code>4fb113b</code></a> (builder) - build: base image replace by alpine</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/443df48c699846c176c1e4a12b5bb42abe790633"><code>443df48</code></a> (builder) - minio: fix not bucket error</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/3dab5b0ce203bcc03891122aca73da5c7342a40b"><code>3dab5b0</code></a> (builder) - minio: create bucket error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/734fca6f371bf73d79d35f1fcdc04ff66cb196fc"><code>734fca6</code></a> (controller) - autoscale: Fix for autoscale on k8s-1.9+ without breaking manual scaling</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a7dcd1000965fae97bad4dc4b908741f856e2d2b"><code>a7dcd10</code></a> (controller) - controller: test pass</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/93f0f2eaa361386bf7775edcbc27c143a71f0dc7"><code>93f0f2e</code></a> (controller) - controller: fix migrations error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4724375b4319e1cbfa1a587e0e856d9eb9b6ac00"><code>4724375</code></a> (controller) - controller: fix test error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7bacf298db4e431c58e86cef028f99fffb5b349e"><code>7bacf29</code></a> (controller) - charts: fix clusterrole</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/90957f727cc883084ff1a81deaada4d62419f0a9"><code>90957f7</code></a> (controller) - pod: sort events error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/440b13edb6e5b9c9fa69f8b6c72f10329a4087d2"><code>440b13e</code></a> (controller) - controller: review table structure</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0a470a6ecffa1fa9d5ef2bb0a71b00ddefb84a1f"><code>0a470a6</code></a> (controller) - controller: bump tornado 5.1.1</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e39218b2216591b7d412baeee5c8e85a7209996d"><code>e39218b</code></a> (controller) - pynsq: no current event loop in thread</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1d8630e250c65051df90b22f023f0f95034f0cc1"><code>1d8630e</code></a> (controller) - tests: fix test_task.py run error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1ff120213ee452a570a1e23dff85ab3032704a30"><code>1ff1202</code></a> (controller) - controller: fix test case</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d8c0da319db0b559eb8c8b0c28280d7e70613da2"><code>d8c0da3</code></a> (controller) - settings: fix env name</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/6d8fd3605f54c5a3c7ce0d4e5164f772fa22a8ec"><code>6d8fd36</code></a> (database) - 003_restore_from_backup.sh: ignore script exit 1</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/e0394a9a6aa44a066df18b8ad3ddd21e9c9fa1c2"><code>e0394a9</code></a> (database) - minio: fix not bucket error</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/f35f2525602c90dbe397f56005206ed6abf6eb39"><code>f35f252</code></a> (database) - mc: fix create_bucket error</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/74d68865fb7502d04e74418cc2b6ef8316c45778"><code>74d6886</code></a> (database) - postgres: recovery mode not run</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/e50d0c105151dac43b2bbc5f4e316a47dd55e925"><code>e50d0c1</code></a> (dockerbuilder) - caddy: fix caddy not start</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f3bec7a8a63c586d19caa777b3fa4a7d0de112c7"><code>f3bec7a</code></a> (fluentd) - influxdb: fix influxdb host and port</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/bc19f27d1567281c5c1ae10b9072c9aad33e2013"><code>bc19f27</code></a> (fluentd) - charts: skipped value for daemon_environment: Not a table</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/338d6237ed76464fc47a6ca3d6f3d34927af6aa2"><code>338d623</code></a> (logger) - logger: logger not run in alpine</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/77883026f33f38aa9d01dd4d88298d162a9050e1"><code>7788302</code></a> (minio) - minio: bump minio version</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/619eed0426591646d5fa9e72b77391d6ac817946"><code>619eed0</code></a> (minio) - fix: use go mod replace dep</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/3b42122703b8bfa3203c8115b8d673f2081d2559"><code>3b42122</code></a> (monitor) - monitor: fix host error</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/67998eff2439c406db048a868f61ae9861268449"><code>67998ef</code></a> (monitor) - influxdb: replace drycc-monitor-influxapi to drycc-monitor-influx-api</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/2cc361cf42754562ffa5b6e7c2e14c065e2cd0f1"><code>2cc361c</code></a> (registry) - registry: fix test case</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/548297a7b97e8f28498fa51b50f9232d8c78053b"><code>548297a</code></a> (registry) - minio: fix not bucket error</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5412ddb1b956fad53d0c59a87c2158b6e014b05f"><code>5412ddb</code></a> (registry) - minio: create bucket error</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/d0d629e5a58d7e91421f2cd344029474e5c630d4"><code>d0d629e</code></a> (slugbuilder) - slugbuilder:fix normalize_storage path</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/d76ecbe4d4d05aeb23a566b2d3c929cca4e63e63"><code>d76ecbe</code></a> (slugbuilder) - slugbuilder: use v3 api</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/c505e182006dd8a734efa14fc851f15340d05929"><code>c505e18</code></a> (slugbuilder) - shellcheck: SC2039</li> +</ul> +<h4 id="style">Style<a class="td-heading-self-link" href="#style" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/c893a1771550c7728f697216b17e38da0f18ec3f"><code>c893a17</code></a> (builder) - builder: fmt code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bba5795cd3f3f36bf2a4b6d37661254143f60328"><code>bba5795</code></a> (controller) - controller: format code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d36082b6f0fbf46487e3fdc6aff0e7866f6462a7"><code>d36082b</code></a> (controller) - controller: fix pep8</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/66026f2f2110fca58f783b8844d9c5b7a794d1f4"><code>66026f2</code></a> (controller) - resource: standardize the naming of resource</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/03d7e2c8bfb120627ec13c4aa37ff7bc3074e88e"><code>03d7e2c</code></a> (controller) - servicecatalog: change servicecatalog to svcat</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/49dbb6d99655dd398978b273ce3fb29051a56cb7"><code>49dbb6d</code></a> (controller) - controller: flake8 upgrade</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/cbfc108b4f209dfbd088f260fe84399bdda5d502"><code>cbfc108</code></a> (monitor) - monitor: format charts and dashboard</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/ee85954d57ae9d19e6e2790090a6fcf1413e8b2d"><code>ee85954</code></a> (slugbuilder) - slugbuilder: use shellcheck</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/3afed2e3592173fcc3522d71dfdbdd45a8b70a01"><code>3afed2e</code></a> (slugbuilder) - docker: simplify dockerfile</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/36b7f688afcb9c8c81016fbbc7b8a3da9537911d"><code>36b7f68</code></a> (slugrunner) - docker: simplify dockerfile</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/61bb0ef367bdabdb3072473e1d639d723b2a8f08"><code>61bb0ef</code></a> (builder) - aws: upgrade aws sdk version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0f2e074b748b9f7067cadac63fb83684bc582272"><code>0f2e074</code></a> (builder) - chore: use go mode replace dep</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e9a2219c2d1c9303cd1a60d2e9bdc9e676f07348"><code>e9a2219</code></a> (builder) - builder: delete glide up</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/bb8c518645bcee82e6ab7782496799b6b82b9fd4"><code>bb8c518</code></a> (builder) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fa6d02f54af2daf51c1b08b4b7ad6a3be2425b45"><code>fa6d02f</code></a> (builder) - builder: upgrade go.sum</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9d61e8da908fae47c33a77c8547e80d1d6d3d812"><code>9d61e8d</code></a> (builder) - build: upgrade go.mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d763a984a800366eb2f6384fbf23c596342720fb"><code>d763a98</code></a> (builder) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d1bc1aae69b9b16859e11bfa18b1fa2b602bc686"><code>d1bc1aa</code></a> (builder) - pkg: upgrade to new drycc/pkg</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/02b1e98a3b208be80326adb85307663ef931adf6"><code>02b1e98</code></a> (builder) - builder: update go mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8e17d6579e022ce3574ee7582a1f48fc88bb5e95"><code>8e17d65</code></a> (builder) - builder: change alpine repositories</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f32b723ef49069ffeee6f2419e87b5450617df1e"><code>f32b723</code></a> (builder) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e33dc612d4910ad3b0e56fbb797a7d1dd609bf6d"><code>e33dc61</code></a> (builder) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/3ab4f1c4a587f58230c1c91670831a0927dc6dfb"><code>3ab4f1c</code></a> (builder) - builder: update controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/b2adfac62d24626a8dc5f2cf4d011c4610170e3a"><code>b2adfac</code></a> (builder) - heroku: remove heroku-16 support</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f429ac8fa76a4b59ed36ab9b1dc2bfee19d0be3e"><code>f429ac8</code></a> (builder) - builder: set GIT_LOCK_TIMEOUT to 30 minutes</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7197c833a68b1168ee4eba0ac16a6fb569f2066e"><code>7197c83</code></a> (builder) - go.mod:upgrade require pkg controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5f3e22dc87a55d9bd8fd3299f37be26b19c2350f"><code>5f3e22d</code></a> (controller) - deps: bump django from 1.11.21 to 1.11.22 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1db645af644946d8694234b0b7e1f22e762c5424"><code>1db645a</code></a> (controller) - deps: bump django from 1.11.22 to 1.11.23 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/fbe80677bc8fe7d19772a0bc002fb541106ef75d"><code>fbe8067</code></a> (controller) - deps: bump django from 1.11.23 to 1.11.29 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/537d667d5fd896eec054adda6185042d6492cbd1"><code>537d667</code></a> (controller) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a23c65b14ba90a60a6d57aa56a12f201ad7ba33b"><code>a23c65b</code></a> (controller) - deps: update all deps to the latest version</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/546337eced482db0b8e879ce8caaa322503f5f52"><code>546337e</code></a> (controller) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/06023f8b84897c4aeaa14fc45c6d35c16eeed1d7"><code>06023f8</code></a> (controller) - workflow-manager: del workflow-manager</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bba573609e25e87875ca40ccdef6e4dd4c8cfd1a"><code>bba5736</code></a> (controller) - controller: change cluster-issuer location</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6c436612923a18486982c268d1e23bbd42a3f9a7"><code>6c43661</code></a> (controller) - Certificatechange cluster-issuer location</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/39a47288e3e0bcf7bfa55768c6759ac94c416c33"><code>39a4728</code></a> (controller) - controller:change cluster-issuer location del controller-cluster-issuer.yaml</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9e96d3f9ccda7f8934628444e72e4959bafde91a"><code>9e96d3f</code></a> (controller) - Certificate:upgrade version cert-manager.io/v1alpha2</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8e68049a870b2277663bd0dc09430baa343a5881"><code>8e68049</code></a> (controller) - docker: use INDEX_URL replace index.docker.io</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8fda20583558fefcd239d5e2d6ae09c5c5f881a7"><code>8fda205</code></a> (controller) - cert_manager: change cert_manager_enabled to global</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6fefb6d00f8909d7269a9171af9db7ba016533c4"><code>6fefb6d</code></a> (controller) - charts: change platform_domain to global</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/064b2ad886b7782598a7f68925d5275ebd88bfd4"><code>064b2ad</code></a> (controller) - maintenance: remove maintenance support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b8797c98a1b2e01f835169ca7493fff508a3cf95"><code>b8797c9</code></a> (controller) - workflow: remove namespace</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1b20d7632a8ca8e4e9f0f6b1c98826af1d846008"><code>1b20d76</code></a> (controller) - quota: add kube quota config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d780075077cf9f9843ecf79ae36e569eec59cd3d"><code>d780075</code></a> (controller) - pod: add pod default resources support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d72c0817b582f050321396240bd4a6bad3bfb16"><code>3d72c08</code></a> (controller) - rename: rename ingress name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0aa6ab9cd277231420b1404b922601debe0aa89b"><code>0aa6ab9</code></a> (controller) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7533a65e78efd06ebe809712791c5399b85efcba"><code>7533a65</code></a> (controller) - heroku: remove heroku-16 support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e5a885d676f052ffdee6bc74e2fe0cffb85a1f86"><code>e5a885d</code></a> (controller) - controller:check mount volume path</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9014e74b5c0312014aa9d20cf9d6aff128f8022f"><code>9014e74</code></a> (controller) - test: optimization Dockerfile.test</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0b6ebb2f0e18f7e97ed2bb7b2c6008e3be7248f2"><code>0b6ebb2</code></a> (controller) - tasks: change apply_async parameters</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/835f009573d5643d271b6e558793b1c9ae1463da"><code>835f009</code></a> (controller) - wsgi: add tornado 6 support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/67a4ad7cbd50cd9de1214e8d4be27196e8077367"><code>67a4ad7</code></a> (controller) - utils: use threads replace asyncio</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a28949b093e9f4d73c798f24e41d1eaff0cc1cc2"><code>a28949b</code></a> (controller) - ldap: add AUTH_LDAP_USER_FLAGS_BY_GROUP</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a903209c062f3e275f97bc18dc1d2b9a17e1a826"><code>a903209</code></a> (controller) - charts: add custom controller environment variables support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e0e783ecb5e87bf68e83411cfd92f54916aa9931"><code>e0e783e</code></a> (controller) - ldap: change filter style</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d7608251c2f8938b8f5ee1edd0c7d0f371931826"><code>d760825</code></a> (controller) - scheduler: remove debug log</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a25928ee84e75a84c13c5402cc351e1ec6e3f151"><code>a25928e</code></a> (controller) - wsgi: remove a wsgi.py file</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7b2696e3ea066b59395b63d97fbad5a472d49b5b"><code>7b2696e</code></a> (controller) - log: disable nsq.client info log</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8d5c07b49ba4220ba7946a8bef1a22b1e8d78e47"><code>8d5c07b</code></a> (controller) - charts: add default environment</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/025f4a2ea96c883df3c35b961aaac2bdd9a5b4ea"><code>025f4a2</code></a> (controller) - controller: change quota name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ebda60ed125f49524169cb320c79c37d5adc2e6c"><code>ebda60e</code></a> (controller) - controller: review pvc code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8832ba952281c2a06dc98dfc6726e7f9e9207d81"><code>8832ba9</code></a> (controller) - controller: change status\binding model type and mount path check container_types</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7148d04c5f1223f06747fae9a33cb3787159ce9e"><code>7148d04</code></a> (controller) - controller: add overcommit cpu and ram support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4d2087cc9c783e5c2722fd446b64c7263b783001"><code>4d2087c</code></a> (controller) - limits: modify limits unit verification</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/af36970d90b9a8d95857052ab1c97b7727a01976"><code>af36970</code></a> (controller) - api: check cpu/memory range for api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/329355b6cdde8a382a5fe271f764cca747cd9444"><code>329355b</code></a> (controller) - volumes: modify the volume size</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9dfee0919449d13e11ec3cfe50a187ecd5de07b2"><code>9dfee09</code></a> (controller) - LimitRanges: modify the default limits</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5205bca582cd292fcfa7c0abb1bcc98c3dce05f1"><code>5205bca</code></a> (controller) - controller: improve the details of certificate</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/7ebecdfdca2de4936b67bc542053305f098db6d6"><code>7ebecdf</code></a> (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/6415e2ccacef3af313b4df2e7d0924797217238f"><code>6415e2c</code></a> (database) - postgres: upgrade to pg13</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/12e68062d48938c8619f94c30741af6fd2fee8e9"><code>12e6806</code></a> (database) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/d294509c192eb7e2f6f11aedad8aefff83fb8532"><code>d294509</code></a> (database) - minio: use canary minio test</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/1bad02e1768d4d54df61f7df3e54c81bd68e6c52"><code>1bad02e</code></a> (database) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/d51420bbde24cada100f764288c9bd165dbc9f31"><code>d51420b</code></a> (database) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/4133d05d8edec1f1ba2b995354dc98ae863a1da7"><code>4133d05</code></a> (dockerbuilder) - dockerbuilder: update caddy and kaniko</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/6b4dd18637b3a81a64c1be34a6d73832095c638d"><code>6b4dd18</code></a> (dockerbuilder) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/6df9b7c0bc4a22bca7ed2588a070868680382f68"><code>6df9b7c</code></a> (fluentd) - deps-dev: update rake requirement from ~&gt; 10.0 to ~&gt; 12.3</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/c2490f84d991ddfc588bded7e6afe9706e82f090"><code>c2490f8</code></a> (fluentd) - fluentd: upgrade fluentd</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/be4a56a12ce0c8a812b8922630122225532ac3fa"><code>be4a56a</code></a> (fluentd) - fluentd: add Gemfile.lock</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/2237f755e0123eb4138289648b5a0ee64bbd4183"><code>2237f75</code></a> (fluentd) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/c5740650bcb218c59676733c20f5765ae4cb905d"><code>c574065</code></a> (fluentd) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/52b8084cbaa5d0b8c8ca7014f94b596dca911708"><code>52b8084</code></a> (fluentd) - router: delete obsolete router code</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/3b3ccebeced1c4257c0c3ed1a70b7f18a8c6aa85"><code>3b3cceb</code></a> (fluentd) - fluentd: remove manifests dir</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/25c6702f8c1e1c5916b0544ccda64eced3451448"><code>25c6702</code></a> (fluentd) - nsqd: change var name</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/bd571be4178f69cb4bd7ee233440ca889ec5c601"><code>bd571be</code></a> (fluentd) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/72aa4e6b7fe5cb5ef784f894429e3f1e177e5c82"><code>72aa4e6</code></a> (fluentd) - influxdb: change influxdb service name</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/bd61903dd01aa61374a5f527f8ee85bc7820c042"><code>bd61903</code></a> (logger) - logger: use go mod replace dep</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/69c63a1bd602c9a5a68ef3b93d43b2dca161d495"><code>69c63a1</code></a> (logger) - logger: update go.mod</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/3aa9cd715568b46efa26025f25c73ce897436b4f"><code>3aa9cd7</code></a> (logger) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/f05849639ef8e34bacf9a55965ab3d7297df4cf7"><code>f058496</code></a> (logger) - nsqd: change var name</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6d9787cebb2e992de9743ac0544201b012b21094"><code>6d9787c</code></a> (logger) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/85ed307592a38ae80186f59bf31e504124013e07"><code>85ed307</code></a> (logger) - logger: standard naming</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/d88e7b65131e2fdaa7d4164a4d66793d89cc384d"><code>d88e7b6</code></a> (minio) - minio: update minio api to v7</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/43715d2dd30bc15f5564124e0e5e444ce7ca63c2"><code>43715d2</code></a> (minio) - minio: upgrade minio</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/0e1239b358ce3bde11a1401634f519b7e1c38156"><code>0e1239b</code></a> (minio) - minio: use docker.io replace quay.io</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/f7f047b506a0e6b30b7b88e916d67b1faaba8a52"><code>f7f047b</code></a> (minio) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/afa71289345ed311e603c8847188ccef40774869"><code>afa7128</code></a> (minio) - build: upgrade go.mod</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/aff2db5a41ae72b899f2fc9f70af96730ed16fdf"><code>aff2db5</code></a> (minio) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/4547f14617a76db897b71ef7451db92a832dff1e"><code>4547f14</code></a> (minio) - pkg: upgrade to new drycc/pkg</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/2769b85cbd316cb08da58753d6bae3946d32032a"><code>2769b85</code></a> (minio) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/35dde8df07fb96c4996ef8410780da48e1170e4a"><code>35dde8d</code></a> (monitor) - monitor: update grafana influxdb telegraf</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9e3a949734f326290dd752c636991cf2e1c962f9"><code>9e3a949</code></a> (monitor) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6af0432fe174769e9d44c03c264ad4a9ea5cee5f"><code>6af0432</code></a> (monitor) - workflow-manager: remove workflow-manager</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/0611c07996da19eb1401278ad5cc5e46d3b1435c"><code>0611c07</code></a> (monitor) - router: delete obsolete router code</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/be048248577d97f8679863c179999ce843806c09"><code>be04824</code></a> (monitor) - cert_manager: change cert_manager_enabled to global</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/37801650414da8539390c4d7cad66f614b90ef6e"><code>3780165</code></a> (monitor) - charts: change platform_domain to global</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/50b04e15f9c3aa51751bb78250907fa22023a419"><code>50b04e1</code></a> (monitor) - influxdb: remove influxdb admin ui</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6ab4d68b758904d12697b9a129835e6d0474cafb"><code>6ab4d68</code></a> (monitor) - influxdb: remove unuse port</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f1510bd94e48ea41ff4c36ac2140688b5c2dde87"><code>f1510bd</code></a> (monitor) - monitor: update grafana dashboard,telegraf inputs.kubernetes</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f36de2c251dc63b21a1fdc2c05413d6d50e9f8cb"><code>f36de2c</code></a> (monitor) - pvc: upgrade to new format</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/fc78a0a2627b51a28c730e19f2c8c1c16103829f"><code>fc78a0a</code></a> (monitor) - workflow: remove namespace</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e85890f298dd68cf6c0e8af70d843e84da600361"><code>e85890f</code></a> (monitor) - monitor: monitoring nsqd and redis separately</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/694f6b1dc801769a8fe82b90ba26422747df6539"><code>694f6b1</code></a> (monitor) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/4aea36a822079ba593a646683dba0e35e3e68416"><code>4aea36a</code></a> (monitor) - grafana: add ldap support for grafana</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/68fc30f0f05af759b80e07c4dcd3d2a57c7ffd6a"><code>68fc30f</code></a> (nsqd) - nsq: update nsq</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/16f32aaf7b984b24853044b6619dbe9f2b8613e2"><code>16f32aa</code></a> (nsqd) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/04db389e01f6832a6a105a73a0a02c9b7dd6623b"><code>04db389</code></a> (redis) - reids: update to redis 6</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/3f01bab0dbe89fa4094750bdb5c3f0ac503b8f00"><code>3f01bab</code></a> (redis) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/647e4bed5f617727fd50c5e0645fd27cc128461e"><code>647e4be</code></a> (registry) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/0bbce990d4ff5660ce79020e0bca346a0c716b3d"><code>0bbce99</code></a> (registry) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/a982b503350abfd584d33d0e088bc0a79714fb9c"><code>a982b50</code></a> (registry) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/e088da3304147b568868e0546c321b57f84263b9"><code>e088da3</code></a> (registry-proxy) - ingress: renmae use_native_ingress to use_ingress</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7e88337bbfbc73bc30bd0906f25027c5d266b1c2"><code>7e88337</code></a> (registry-proxy) - nginx: upgrade nginx to mainline</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7204d72c00b2d7360a2d3a20833d701e303a9f62"><code>7204d72</code></a> (registry-proxy) - registry: optimizing variable naming</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/2eafc592dc68c529a8a3a8077ef9d48916718079"><code>2eafc59</code></a> (registry-proxy) - registry-proxy: update nginx</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/071bd86ae3bef755f47e22aad54762a7f1e4c0f1"><code>071bd86</code></a> (registry-proxy) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/c72db9618ee6a73655b4b2c5e940ee9fc9447380"><code>c72db96</code></a> (registry-proxy) - registry-proxy: change travis icon url</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/ca9f9623a6867f0c5f4ff973c06613deff9e5dd3"><code>ca9f962</code></a> (slugbuilder) - slugbuilder: del BUILDPACK_URL support</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/1b74dd57a7f19040577f8e55b6a9d993ef496c8d"><code>1b74dd5</code></a> (slugbuilder) - slugbuilder: add heroku-20 support</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/54d4ad2e97e9ff5c805ac985a0e5af0050677388"><code>54d4ad2</code></a> (slugbuilder) - slugbuilder: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/a78f37ee99cec1b7c3eb7cb7a803bf2a5ed7c45b"><code>a78f37e</code></a> (slugbuilder) - slugbuilder: add heroku-20 stack</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/94ac94ac5dd4a387c0e1aaef6638954e41e9983a"><code>94ac94a</code></a> (slugbuilder) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/53b4b8b7ef9dece421a7893c5c3137ab0df8b960"><code>53b4b8b</code></a> (slugbuilder) - slugbuilder: modify stack priority</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/58e2bd28cf5fda8c618a2ba540d9e3acbf46fab5"><code>58e2bd2</code></a> (slugbuilder) - dockerfile: add WORKDIR /tmp</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/b29cd04c1769ef3481ff7c61c41a6e8722664469"><code>b29cd04</code></a> (slugbuilder) - slugbuilder: add pre_build.sh</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/9d319f60a1edd735bc5217054fe365047bd8795a"><code>9d319f6</code></a> (slugbuilder) - slugbuilder: silent mc command output</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/d1ec3c983be9934dd6b86fa51200489eb5555fa7"><code>d1ec3c9</code></a> (slugbuilder) - heroku: remove heroku-16 support</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/5048534c684b76f41ca12136cefd6e6da51ace3e"><code>5048534</code></a> (slugbuilder) - slugbuilder: use drycc stack-images</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/a1165373fc9ca369eec2715a2a49f166430cefa9"><code>a116537</code></a> (slugrunner) - slugrunner: add heroku-20 support</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/a1196bf153c21cefde2122aee5bf7dfa32ac5f0a"><code>a1196bf</code></a> (slugrunner) - slugrunner: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/64c96d720f4b5cdc54b66d349bac6de5567ab331"><code>64c96d7</code></a> (slugrunner) - slugrunner: add heroku-20 stack</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/cc3e2264b67f950fb888502aeea08d41d4c8ccf4"><code>cc3e226</code></a> (slugrunner) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/9130bde01bcfa897ae5c4be6bc59b4a4fe7b92f3"><code>9130bde</code></a> (slugrunner) - shellcheck: shellcheck installer</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/4ea33e154ab4353de5bd5bf6afeb0157756224e8"><code>4ea33e1</code></a> (slugrunner) - slugrunner: modify stack priority</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/5514e8b393daa6f4cd8f3ebe0a619158e32945e6"><code>5514e8b</code></a> (slugrunner) - heroku: remove heroku-16 support</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/be829fb66e68bb9ccc2a1d49e1b364af09219fff"><code>be829fb</code></a> (slugrunner) - slugrunner: use drycc stack-images</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/e1e06be74f2f40740c8e72178ae6ba97233c5bbe"><code>e1e06be</code></a> (slugrunner) - slugrunner: remove Dockerfile.heroku-16</li> +</ul> + + + + + + Blog: Drycc Workflow v1.3.0 + /blog/2020/10/06/drycc-workflow-v1.3.0/ + Tue, 06 Oct 2020 00:00:00 +0000 + + /blog/2020/10/06/drycc-workflow-v1.3.0/ + + + + <p>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.</p> +<h2 id="workflow--v120---v130">Workflow ## v1.2.0 -&gt; v1.3.0<a class="td-heading-self-link" href="#workflow--v120---v130" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.0.2 -&gt; v1.1.0</li> +<li>slugbuilder v1.1.0 -&gt; v1.1.1</li> +<li>dockerbuilder v1.1.0 -&gt; v1.1.1</li> +<li>controller v1.2.0 -&gt; v1.2.1</li> +<li>slugrunner v1.1.0 -&gt; v1.1.1</li> +<li>database v1.0.0 -&gt; v1.0.1</li> +<li>fluentd v1.0.0 -&gt; v1.0.1</li> +<li>minio v1.0.0 -&gt; v1.0.1</li> +<li>monitor v1.0.0 -&gt; v1.0.1</li> +<li>registry v1.0.1 -&gt; v1.0.2</li> +<li>workflow-manager v1.0.0 -&gt; v1.0.1</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9c7cceb2b775850cbe30c6df7b03bdcf7a35d0d2"><code>9c7cceb</code></a> (builder) - builder: add app config to env</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7fe44faf2663b20e39b27221a8426cf332f2085b"><code>7fe44fa</code></a> (controller) - docker: docker timeout must be an int, float or None</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b196550f9ac51f22f422e29d6b1a7aa3708421c3"><code>b196550</code></a> (controller) - controller: revert release.check_image_access for now</li> +<li><a href="https://api.github.com/repos/drycc/workflow-manager/git/trees/cc3ec13a5d5173160f1f6b42726df81119cd69ae"><code>cc3ec13</code></a> (workflow-manager) - glide: bump goautoneg</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ef932c4eb4ea0d592b57f0a4aebdbd6ad039c998"><code>ef932c4</code></a> (builder) - controller-sdk-go: upgrade controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4654cf64a919aa64b10253b080e0b6aae86edcb5"><code>4654cf6</code></a> (controller) - django-rest-framework: upgrade to 3.9.3</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/14121f1dae135b137f8ded451cfd1d8f8ca62543"><code>14121f1</code></a> (controller) - deps: bump djangorestframework from 3.9.3 to 3.9.4 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/385acdc7e0359eedb83e10e71877a9ff591bff15"><code>385acdc</code></a> (controller) - deps: bump django from 1.11.20 to 1.11.21 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/fa312bb7f57f5f8638484bc4d9825aa962031a25"><code>fa312bb</code></a> (database) - postgres: set max_connections = 1024</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/7ebecdfdca2de4936b67bc542053305f098db6d6"><code>7ebecdf</code></a> (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/b8878f6d4c32540bc864581a457aa6c996e7e50c"><code>b8878f6</code></a> (dockerbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/b097451f312c0386c466be3b638242535849def0"><code>b097451</code></a> (fluentd) - fluent: upgrade fluent to v1.4</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/4341f9ae71b5dc55c14984d9cacc8e48a3e6e089"><code>4341f9a</code></a> (minio) - mc: upgrade mc and minio</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c1ee2a46808c6054ab1393cdd31bf861e01ebdfc"><code>c1ee2a4</code></a> (monitor) - monitor: remove copyrights.tar.gz</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/9854260ef4738be5d25e4a028ebd3125988fec34"><code>9854260</code></a> (registry) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/acc5627dd8f96d3f62e02cd8813cbd829321bd18"><code>acc5627</code></a> (slugbuilder) - slugbuilder: internal support for multi buildpack</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/d58907eb664185c25950953dae4fe4774a2f6310"><code>d58907e</code></a> (slugbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/b39a0c29fef7d76ae681ec7ba2f01e3605a33657"><code>b39a0c2</code></a> (slugrunner) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +</ul> + + + + + + Blog: Drycc Workflow v1.2.0 + /blog/2019/10/06/drycc-workflow-v1.2.0/ + Sun, 06 Oct 2019 00:00:00 +0000 + + /blog/2019/10/06/drycc-workflow-v1.2.0/ + + + + <p>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.</p> +<h2 id="workflow--v110---v120">Workflow ## v1.1.0 -&gt; v1.2.0<a class="td-heading-self-link" href="#workflow--v110---v120" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.0.1 -&gt; v1.0.2</li> +<li>slugbuilder v1.0.0 -&gt; v1.1.0</li> +<li>dockerbuilder v1.0.0 -&gt; v1.1.0</li> +<li>controller v1.1.0 -&gt; v1.2.0</li> +<li>slugrunner v1.0.0 -&gt; v1.1.0</li> +<li>registry v1.0.0 -&gt; v1.0.1</li> +<li>registry-proxy v1.0.1 -&gt; v1.0.2</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e5584e32ef02329fd091a7a4d3f40bac9894d5a4"><code>e5584e3</code></a> (controller) - controller: add STACK support</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/ad34dc1a501aada4aa2f8ceeb7eefa9fed6baf75"><code>ad34dc1</code></a> (dockerbuilder) - kaniko: use kaniko replace docker-py</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/b81430e8d7ac10167450667cf41e2f9efada6cca"><code>b81430e</code></a> (dockerbuilder) - dockerbuilder: change image to image.json format</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/60dde96064c69aa7578476c2e4855680f5186706"><code>60dde96</code></a> (slugbuilder) - slugbuilder: add STACK support</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/fe8b6e56dd1a9334844581183bb16eb3d59df366"><code>fe8b6e5</code></a> (slugrunner) - slugrunner: add STACK support</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/942f050ec90f771262cbb5634f5df8d5a3818a5d"><code>942f050</code></a> (builder) - registry: remove env DRYCC_REGISTRY_PROXY_PORT</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ff7a16f53ac78dac0c334a9718cdc76c65400732"><code>ff7a16f</code></a> (builder) - registry: remove ecr and gcr registry</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ad13683ce634c9b4835f45d2b474bac16ca52baa"><code>ad13683</code></a> (builder) - builder: change DRYCC_BUILD_TYPE to DRYCC_STACK</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/6def637d5331330940d0a94cf6313a4bcb67fec0"><code>6def637</code></a> (builder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5044e223a56ee6283ac8d68a1442a6430b18dd99"><code>5044e22</code></a> (builder) - registry: remove registry_secret_prefix</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2ea39cc0a9dd68fa1baca4b3725a00b9bcf7f89a"><code>2ea39cc</code></a> (builder) - controller-go-sdk: upgrade controller-go-sdk</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/6aee0d7f092b53c37c70d05db076eaae1bbcff44"><code>6aee0d7</code></a> (builder) - registry: optimizing variable naming</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f9c62d9db809bfe03af33092e71a16e56fc35483"><code>f9c62d9</code></a> (controller) - domain: added reserved domain check</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f5a135be6aa2b319e623fd59bb711705d1cfe13f"><code>f5a135b</code></a> (controller) - migrations: clean old migrations</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4369b2c2fb6ef861978588a61efa1bfc6a4572ec"><code>4369b2c</code></a> (controller) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1057ca59c3ae6bbd85d772f6b49b0c542d7d18c4"><code>1057ca5</code></a> (controller) - registry: remove registry_secret_prefix</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d114b3e93544624a5f01b1ca71db92d0b33f4e0d"><code>d114b3e</code></a> (controller) - docker: update docker client</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/edbe9631dcfb34ed50d9e931d36506fa262b6299"><code>edbe963</code></a> (dockerbuilder) - dockerfile: change base image to alpine</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/fb35baf913ff846e08ba79d9ad8195fca1411684"><code>fb35baf</code></a> (dockerbuilder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/946dbf688474933f821f641f6c027bab68cd9e79"><code>946dbf6</code></a> (dockerbuilder) - docker: remove insecure support</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/628d8532256e32a046268491f2a331dcb608b713"><code>628d853</code></a> (dockerbuilder) - proxy: add registry proxy</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ff27cbdd27e9dc51ce29b6a68777888ed8737862"><code>ff27cbd</code></a> (registry) - env: remove unused env</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7204d72c00b2d7360a2d3a20833d701e303a9f62"><code>7204d72</code></a> (registry-proxy) - registry: optimizing variable naming</li> +</ul> + + + + + + Blog: Welcome to Drycc + /blog/2018/10/06/welcome-to-drycc/ + Sat, 06 Oct 2018 00:00:00 +0000 + + /blog/2018/10/06/welcome-to-drycc/ + + + + <p><strong>Drycc Workflow</strong> is an open source Container as a Service (CaaS) that adds a developer-friendly layer to any <a href="http://kubernetes.io">Kubernetes</a> cluster, making it easy to deploy and manage applications.</p> +<p>We welcome your input! If you have feedback, please <a href="https://github.com/drycc/workflow/issues">submit an issue</a>. If you&rsquo;d like to participate in development, please read the &ldquo;Working on Documentation&rdquo; section below and <a href="https://github.com/drycc/workflow/pulls">submit a pull request</a>.</p> + + + + + + diff --git a/blog/news/_print/index.html b/blog/news/_print/index.html new file mode 100644 index 000000000..003ed32dd --- /dev/null +++ b/blog/news/_print/index.html @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + +News | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

News

+ + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + +
+

Welcome to Drycc

+
Drycc Workflow is A Open, Unified, Lightweight, Simpler Containers as a Service (CaaS).
+ +

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.

+ +
+ + + + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/blog/news/index.html b/blog/news/index.html new file mode 100644 index 000000000..7ebf7c40b --- /dev/null +++ b/blog/news/index.html @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + +News | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+
Posts in 2018
+
    +
  • +
    +
    Welcome to Drycc
    +

    06.10.2018 in News

    + + + + + + +

    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 …

    +

    Read more

    +
    +
  • +
+ +
+
+
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/news/index.xml b/blog/news/index.xml new file mode 100644 index 000000000..22aa7df7f --- /dev/null +++ b/blog/news/index.xml @@ -0,0 +1,33 @@ + + + Drycc – News + /blog/news/ + Recent content in News on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Blog: Welcome to Drycc + /blog/2018/10/06/welcome-to-drycc/ + Sat, 06 Oct 2018 00:00:00 +0000 + + /blog/2018/10/06/welcome-to-drycc/ + + + + <p><strong>Drycc Workflow</strong> is an open source Container as a Service (CaaS) that adds a developer-friendly layer to any <a href="http://kubernetes.io">Kubernetes</a> cluster, making it easy to deploy and manage applications.</p> +<p>We welcome your input! If you have feedback, please <a href="https://github.com/drycc/workflow/issues">submit an issue</a>. If you&rsquo;d like to participate in development, please read the &ldquo;Working on Documentation&rdquo; section below and <a href="https://github.com/drycc/workflow/pulls">submit a pull request</a>.</p> + + + + + + diff --git a/blog/news/page/1/index.html b/blog/news/page/1/index.html new file mode 100644 index 000000000..ad9561b0a --- /dev/null +++ b/blog/news/page/1/index.html @@ -0,0 +1,10 @@ + + + + /blog/news/ + + + + + + diff --git a/blog/page/1/index.html b/blog/page/1/index.html new file mode 100644 index 000000000..d209a5087 --- /dev/null +++ b/blog/page/1/index.html @@ -0,0 +1,10 @@ + + + + /blog/ + + + + + + diff --git a/blog/page/2/index.html b/blog/page/2/index.html new file mode 100644 index 000000000..46960857c --- /dev/null +++ b/blog/page/2/index.html @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + +Blog | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+
Posts in 2019
+
    +
  • +
    +
    Drycc Workflow v1.2.0
    +

    06.10.2019 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
+
Posts in 2018
+
    +
  • +
    +
    Welcome to Drycc
    +

    06.10.2018 in News

    + + + + + + +

    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 …

    +

    Read more

    +
    +
  • +
+ +
+
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/releases/_print/index.html b/blog/releases/_print/index.html new file mode 100644 index 000000000..bed202925 --- /dev/null +++ b/blog/releases/_print/index.html @@ -0,0 +1,2254 @@ + + + + + + + + + + + + + + + + + + + + + +Release | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Release

+ + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.7.8

+
New Drycc Workflow Release v1.7.8
+ +

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 (workflow-cli) - domain: add procfile_type
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.7.7

+
New Drycc Workflow Release v1.7.7
+ +

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
  • +
  • storage v0.0.5 -> v0.1.0
  • +
  • gateway v0.0.2 -> v0.0.3
  • +
  • monitor v1.4.0 -> v1.4.1
  • +
  • redis v1.3.2 -> v1.4.0
  • +
  • timeseries v0.0.2 -> v0.1.0
  • +
  • prometheus v0.1.1 -> v0.1.2
  • +
  • rabbitmq v1.2.1 -> v1.3.0
  • +
  • registry v1.2.2 -> v1.3.0
  • +
  • registry-proxy v1.2.1 -> v1.2.2
  • +
  • workflow-cli v1.5.2 -> v1.6.0
  • +
+

Features

+
    +
  • 6c1cf5e (builder) - charts: reuses the value from an existing secret and config
  • +
  • 65ae63c (builder) - pipeline: add dryccfile support
  • +
  • bb7b11d (builder) - auth: add tokens api
  • +
  • 39d022f (controller) - ps: add pod logs support
  • +
  • 86056d0 (controller) - charts: reuses the value from an existing secret and config
  • +
  • 4cf005c (controller) - limits: add limits plan support
  • +
  • bf60e4b (controller) - controller: add init job
  • +
  • 98f77a8 (controller) - pipeline: add dryccfile support
  • +
  • 8ce9a83 (controller) - cert-manager: add tls events
  • +
  • 7034f5d (controller) - config: deploy according to procfile_type
  • +
  • 5554d8f (controller) - config: add typed_values
  • +
  • 2c5bbad (controller) - auth: add token api
  • +
  • 410d34e (database) - charts: reuses the value from an existing secret and config
  • +
  • 693e4d1 (imagebuilder) - pipeline: add dryccfile support
  • +
  • 7d9cc06 (imagebuilder) - config: add typed values
  • +
  • 854e171 (passport) - charts: reuses the value from an existing secret and config
  • +
  • 7ac9255 (passport) - oauth2: add authorization code for any grant type
  • +
  • 4517547 (rabbitmq) - charts: reuses the value from an existing secret and config
  • +
  • bccfcb4 (redis) - charts: reuses the value from an existing secret and config
  • +
  • d887605 (registry) - charts: reuses the value from an existing secret and config
  • +
  • ff09e5b (storage) - charts: reuses the value from an existing secret and config
  • +
  • c6e2ac8 (timeseries) - charts: reuses the value from an existing secret and config
  • +
  • 22c4c77 (workflow-cli) - apps: change drycc run to async
  • +
  • a9e6369 (workflow-cli) - ps: add pod logs support
  • +
  • 2bc31c8 (workflow-cli) - limits: add limits plan support
  • +
  • f40398a (workflow-cli) - pipeline: add dryccfile support
  • +
  • 03638ff (workflow-cli) - tls: add tls events
  • +
  • 9113627 (workflow-cli) - config: add typed values
  • +
  • 43ee760 (workflow-cli) - auth: add tokens api
  • +
+

Fixes

+
    +
  • 50dfe64 (builder) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • ab09b24 (controller) - healthcheck: delete outdated code
  • +
  • 52019b5 (controller) - services: default PORT change error
  • +
  • f57ae42 (controller) - certificate: failed to create certificate
  • +
  • 30c3f54 (controller) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • dbba43a (controller) - service: update port error
  • +
  • e0459c5 (controller) - copy: use deepcopy replace copy
  • +
  • 2122479 (controller) - charts: failed to call webhook
  • +
  • 53d9977 (controller) - signals: config limits handle error
  • +
  • afda287 (controller) - limits: always set default
  • +
  • b350cb8 (database) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • b48a422 (fluentbit) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 7cebca2 (gateway) - cert-manager: auto tls error
  • +
  • 190c19b (imagebuilder) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 2c6a6f9 (logger) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 10bb98d (monitor) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • f8225dc (passport) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 06db66c (prometheus) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • f4aff72 (rabbitmq) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 88c18ff (redis) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 5dcc19d (registry) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 092a939 (registry-proxy) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 3597ac9 (storage) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 5a49b35 (timeseries) - woodpecker: CI_SYSTEM_ARCH env removed
  • +
  • 0c4a48a (workflow-cli) - tls: change issuer options
  • +
  • 06a2511 (workflow-cli) - tls: info error
  • +
+

Maintenance

+
    +
  • 2f7617e (builder) - go: bump controller-sdk-go version
  • +
  • aae2f29 (builder) - charts: add diagnostic mode
  • +
  • 7304980 (builder) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 30b648b (builder) - charts: change canary app version
  • +
  • 2afa006 (builder) - controller-sdk-go: bump version
  • +
  • d127a90 (builder) - config: add typed values
  • +
  • 32fdfd0 (controller) - charts: add diagnostic mode
  • +
  • 0974942 (controller) - woodpecker: migrations woodpecker-ci to 2
  • +
  • f401e08 (controller) - python: bump python 3.12
  • +
  • c565959 (controller) - celery: remove retrieve_resource task
  • +
  • 47be1a1 (controller) - requirements: bump drf 3.15.1
  • +
  • 99f7468 (controller) - charts: add config to values.yaml
  • +
  • 7d17f5c (controller) - scale: prohibit scale when there is a running pipeline
  • +
  • f09e1c9 (controller) - resource: sort services and plans
  • +
  • e817505 (controller) - limits: change default cpu and gpu name
  • +
  • 5531b2f (controller) - auth: add password login
  • +
  • 27473f7 (controller) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs
  • +
  • c1ee1c7 (controller) - deps: bump aiohttp from 3.9.3 to 3.9.4 in /rootfs
  • +
  • affbcb5 (database) - postgres: add patroni and postgres params (#15)
  • +
  • f9e4eda (database) - dockerfile: install vi
  • +
  • 008b7b6 (database) - dockerfile: install vim instand of vi
  • +
  • dbbfee1 (database) - charts: add diagnostic mode
  • +
  • 2e26c33 (database) - woodpecker: migrations woodpecker-ci to 2
  • +
  • a1b81f2 (database) - charts: change canary app version
  • +
  • bc725e8 (fluentbit) - charts: add diagnostic mode
  • +
  • 5d73886 (fluentbit) - woodpecker: migrations woodpecker-ci to 2
  • +
  • b85072d (fluentbit) - charts: change canary app version
  • +
  • 761174d (gateway) - gateway: change secrets name
  • +
  • 1c304da (gateway) - woodpecker: migrations woodpecker-ci to 2
  • +
  • b919a4c (gateway) - charts: change canary app version
  • +
  • 3cea298 (imagebuilder) - charts: allow all dns
  • +
  • 653bcbe (imagebuilder) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 59daeab (imagebuilder) - charts: change canary app version
  • +
  • 2834a5a (logger) - charts: add diagnostic mode
  • +
  • 6685492 (logger) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 191cdaf (logger) - charts: change canary app version
  • +
  • b3c3cfa (monitor) - charts: add diagnostic mode
  • +
  • 796799d (monitor) - grafana: add node metrics dashboard
  • +
  • ef2a222 (monitor) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 9c83090 (monitor) - charts: change canary app version
  • +
  • 1a97c2c (passport) - charts: add diagnostic mode
  • +
  • 353e1ae (passport) - logger: add oauth2_provider logger config
  • +
  • fe735c0 (passport) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 41d6144 (passport) - charts: change canary app version
  • +
  • 979d474 (passport) - python: bump python 3.12
  • +
  • e9f41a1 (passport) - requirements: bump drf 3.15.1
  • +
  • f479f4d (passport) - charts: add migrate job
  • +
  • ad9abf6 (passport) - passport: migrations add run_before
  • +
  • 95ac667 (passport) - passport: optimize the use of master and slave database rules
  • +
  • 204f7fc (passport) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs
  • +
  • 90a6410 (prometheus) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 2d8eb44 (prometheus) - charts: change canary app version
  • +
  • 9687a17 (rabbitmq) - charts: add diagnostic mode
  • +
  • 35d3d5b (rabbitmq) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 6a6564d (rabbitmq) - charts: change canary app version
  • +
  • cb6722f (redis) - charts: add diagnostic mode
  • +
  • 9553497 (redis) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 1c8dc07 (redis) - charts: change canary app version
  • +
  • 9fa2a32 (registry) - charts: add diagnostic mode
  • +
  • 9b09e51 (registry) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 7dbd390 (registry) - charts: change canary app version
  • +
  • e1d2a33 (registry-proxy) - charts: add diagnostic mode
  • +
  • 3eabfdd (registry-proxy) - charts: remove default limits
  • +
  • f8754da (registry-proxy) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 7df7316 (registry-proxy) - charts: change canary app version
  • +
  • 861d3b8 (storage) - filer: modify the default parameters of the filer
  • +
  • 5fa08da (storage) - woodpecker: migrations woodpecker-ci to 2
  • +
  • 22c4620 (storage) - charts: change canary app version
  • +
  • 6c1e29c (timeseries) - postgres: add patroni params
  • +
  • e280d3f (timeseries) - dockerfile: install vi
  • +
  • 5213617 (timeseries) - dockerfile: install vim instand of vi
  • +
  • a569a57 (timeseries) - charts: add diagnostic mode
  • +
  • b93ec70 (timeseries) - woodpecker: migrations woodpecker-ci to 2
  • +
  • ff3b870 (timeseries) - charts: change canary app version
  • +
  • e334f74 (workflow-cli) - healthcheck: delete outdated healthcheck style
  • +
  • 4f8b960 (workflow-cli) - auth: add password login
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.7.5

+
New Drycc Workflow Release v1.7.5
+ +

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.

+

Workflow ## v1.7.4 -> v1.7.5

+

Releases

+
    +
  • builder v1.5.0 -> v1.5.1
  • +
  • controller v1.6.3 -> v1.7.0
  • +
  • logger v1.3.2 -> v1.3.3
  • +
  • storage v0.0.3 -> v0.0.4
  • +
  • redis v1.3.1 -> v1.3.2
  • +
  • rabbitmq v1.2.0 -> v1.2.1
  • +
  • registry v1.2.1 -> v1.2.2
  • +
  • workflow-cli v1.5.1 -> v1.5.2
  • +
+

Features

+
    +
  • 95d130a (controller) - controller: volume support nfs
  • +
+

Fixes

+
    +
  • ee2ee15 (controller) - controller: container entrypoint error
  • +
  • 03ea4f8 (controller) - controller: class property have been deprecated in python 3.11
  • +
  • 5f04d17 (controller) - controller: miss err msg
  • +
  • 27972a3 (controller) - controller: load_db_state_to_k8s err
  • +
  • a005d62 (controller) - controller: volume repeat path no error
  • +
  • c7a5ba6 (rabbitmq) - rabbitmq: cpu usage to high
  • +
  • 45c2077 (workflow-cli) - workflow-cli: miss err msg
  • +
  • bc738bd (workflow-cli) - workflow-cli: volumes list format
  • +
+

Maintenance

+
    +
  • 35e1c06 (builder) - builder: bump golang 1.22
  • +
  • 26caa36 (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.10
  • +
  • e625c2f (logger) - logger: bump golang 1.22
  • +
  • bfa500d (redis) - redis: headless svc does not require ports
  • +
  • 330209a (registry) - registry: headless svc does not require ports
  • +
  • 48c42eb (storage) - storage: change volume index to leveldb
  • +
  • f4fde9d (storage) - storage: add volume size limit
  • +
  • 33e3684 (workflow-cli) - workflow-cli: volume support nfs
  • +
  • 48d5950 (workflow-cli) - workflow-cli: bump golang 1.22
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.7.6

+
New Drycc Workflow Release v1.7.6
+ +

Workflow ## v1.7.5 -> v1.7.6

+

Releases

+
    +
  • storage v0.0.4 -> v0.0.5
  • +
+

Maintenance

+
    +
  • 6cb63b6 (storage) - seaweedfs: bump version 3.63
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.7.2

+
New Drycc Workflow Release v1.7.2
+ +

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.

+

Workflow ## v1.7.1 -> v1.7.2

+

Releases

+
    +
  • controller v1.6.0 -> v1.6.1
  • +
  • logger v1.3.1 -> v1.3.2
  • +
  • storage v0.0.1 -> v0.0.2
  • +
  • timeseries v0.0.1 -> v0.0.2
  • +
  • prometheus v0.1.0 -> v0.1.1
  • +
  • workflow-cli v1.5.0 -> v1.5.1
  • +
+

Fixes

+
    +
  • 2fe80a6 (controller) - resources: after resources instance update, could not delete (#111)
  • +
  • a4082ad (controller) - controller: resource status and binding
  • +
  • e9bfccc (controller) - controller: fix multiple volumes mount at one dir error (#116)
  • +
  • 58d2b4c (logger) - logger: redis conn error block
  • +
  • 7cb2700 (prometheus) - prometheus: prometheus config basic_auth
  • +
  • 7838c6b (storage) - storage: random accesskey secretkey
  • +
  • d9dcdfb (storage) - storage: pod restart loses data
  • +
  • 3cbdd29 (storage) - storage: tipd cannot start after deleting pod
  • +
  • be7e11f (storage) - storage: jq command not found
  • +
  • 878f674 (storage) - storage: charts updateStrategy error
  • +
  • 06cfe56 (timeseries) - timeseries: the data node ip is incorrect
  • +
+

Maintenance

+
    +
  • 7f29f5a (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 async
  • +
  • dc6f45e (controller) - controller: add channel for pod exec
  • +
  • af4f3a7 (controller) - controller: avoid error when secret no data field (#117)
  • +
  • ca27956 (controller) - controller: add pod default security
  • +
  • b2e9c64 (prometheus) - charts: node-exporter mount root (#2)
  • +
  • 3cdb2b6 (storage) - storage: bump seaweedfs 3.61
  • +
  • 00dd2fd (storage) - storage: add csi daemonset updateStrategy
  • +
  • 48e763c (storage) - storage: add drycc storage upgrade document
  • +
  • 841df90 (storage) - storage: bump seaweedfs 3.62
  • +
  • cefd52e (timeseries) - timeseries: add check data node exists
  • +
  • ad1c46e (workflow-cli) - resources: resources instance add message
  • +
  • 9f955c2 (workflow-cli) - workflow-cli: add short options cpu
  • +
  • 65399ef (workflow-cli) - workflow-cli: add tty resize support
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.7.0

+
New Drycc Workflow Release v1.7.0
+ +

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.

+

Workflow ## v1.6.0 -> v1.7.0

+

Releases

+
    +
  • builder v1.4.0 -> v1.5.0
  • +
  • controller v1.5.1 -> v1.6.0
  • +
  • database v1.2.0 -> v1.2.1
  • +
  • passport v1.1.0 -> v1.2.0
  • +
  • imagebuilder v1.1.0 -> v1.1.1
  • +
  • fluentbit v0.0.0 -> v0.0.1
  • +
  • logger v1.3.0 -> v1.3.1
  • +
  • storage v0.0.0 -> v0.0.1
  • +
  • gateway v0.0.0 -> v0.0.1
  • +
  • monitor v1.3.0 -> v1.4.0
  • +
  • redis v1.3.0 -> v1.3.1
  • +
  • timeseries v0.0.0 -> v0.0.1
  • +
  • prometheus v0.0.0 -> v0.1.0
  • +
  • rabbitmq v1.1.0 -> v1.2.0
  • +
  • registry v1.2.0 -> v1.2.1
  • +
  • registry-proxy v1.2.0 -> v1.2.1
  • +
+

Features

+
    +
  • fcbebda (builder) - builder: use TCPRoute expose service
  • +
  • d02bb5d (controller) - controller: support app dns policy config
  • +
  • 9aa968e (controller) - controller: add svc type support
  • +
  • 62e2d34 (controller) - controller: improve the services api
  • +
  • 4393755 (controller) - controller: use gateway replace ingress
  • +
  • 323045d (controller) - controller: add canary support
  • +
  • 3f81c97 (controller) - gateways: add addresses field
  • +
  • 4e64aa7 (controller) - gateways: add addresses field
  • +
  • 02ad581 (monitor) - grafana: add pd tikv dashboard
  • +
  • 2a9e2b0 (monitor) - monitor: add storage monitor
  • +
  • 41d5057 (monitor) - grafana: data source change to prometheus
  • +
  • ec035d1 (monitor) - monitor: usegateway replace ingress
  • +
  • c694c98 (monitor) - grafana: add drycc storage seaweedfs dashboard
  • +
  • 1e1fdc8 (passport) - passport: use gateway replace ingress
  • +
  • ffdb408 (prometheus) - prometheus: use gateway replace ingress
  • +
  • 04152b9 (rabbitmq) - rabbitmq: use gateway replace ingress
  • +
+

Fixes

+
    +
  • 0499500 (builder) - builder: manifest error
  • +
  • 642491d (builder) - builder: no build log
  • +
  • 873d146 (controller) - controller: do not set entrypoint when no procfile
  • +
  • d9028c5 (controller) - controller: pip8 error
  • +
  • 3efcfb7 (controller) - controller: manifest error
  • +
  • 18a3a1a (controller) - controller: miss service error
  • +
  • 94f796c (controller) - controller: drycc run pod should not restart
  • +
  • 80f3161 (controller) - controller: monitor query error
  • +
  • b76f2c5 (controller) - controller: read websocket delay
  • +
  • b6e068e (controller) - controller: metrics sql tpl, gateway pod should not restart, cleanup old rs, update monitor datatbase config
  • +
  • ad9adc6 (controller) - controller: rabbitmq sharding err
  • +
  • 6773907 (controller) - controller: default k8s pod annotaions
  • +
  • ffcf1f9 (controller) - controller: under-indented for visual indent
  • +
  • 3afd0cf (controller) - controller: charts env error
  • +
  • 769bb8b (database) - database: manifest error
  • +
  • 769bb8b (database) - database: label conflict error
  • +
  • 6a321c5 (database) - database: link error
  • +
  • 558feae (fluentbit) - fluentbit: build charts error
  • +
  • 98d8a2a (gateway) - fixup
  • +
  • 8b5dde1 (gateway) - gateway: secretName
  • +
  • 702866d (gateway) - gateway: build status
  • +
  • f55dac1 (imagebuilder) - imagebuilder: manifest error
  • +
  • ac13b5f (imagebuilder) - imagebuilder: build svg
  • +
  • 6b7bbc5 (logger) - logger: manifest error
  • +
  • 0136b5c (monitor) - monitor: manifest error
  • +
  • f03d975 (passport) - passport: DRYCC_GRAFANA_DOMAIN error
  • +
  • b530ea8 (passport) - passport: manifest error
  • +
  • be5a0a7 (passport) - passport: change passport
  • +
  • 1596c7f (rabbitmq) - rabbitmq: manifest error
  • +
  • 0dc4f6f (rabbitmq) - rabbitmq: images-shard error
  • +
  • 43293ae (redis) - redis: manifest error
  • +
  • ca13b7d (registry) - registry: manifest error
  • +
  • ab5c793 (registry) - registry: garbage collect error
  • +
  • ab0fabc (registry-proxy) - registry-proxy: manifest error
  • +
  • dfc7236 (registry-proxy) - registry-proxy: daemon yaml format
  • +
  • 42c03be (storage) - storage: seaweedfs csi error
  • +
  • 453e41a (timeseries) - timeseries: could not register node
  • +
+

Docs

+
    +
  • 5433c89 (gateway) - gateway: add prerequisites
  • +
  • 2f0c5d8 (logger) - logger: change architecture
  • +
+

Maintenance

+
    +
  • bdd02eb (builder) - builder: use dynamic clusterrole name
  • +
  • 66b4b25 (builder) - builder: upgrade new controller-go-sdk
  • +
  • 219d86f (builder) - builder: upgrade go.mod
  • +
  • 91f2f14 (builder) - builder: use woodpecker replace drone
  • +
  • 9abca16 (builder) - woodpecker: use woodpecker ci build status
  • +
  • f43dd50 (builder) - deps: bump golang.org/x/net from 0.2.0 to 0.7.0
  • +
  • 0384c69 (builder) - builder: add chart appVersion
  • +
  • e3149b9 (builder) - builder: upgrade codename to bookworm
  • +
  • d88ea1b (builder) - builder: add codename build-arg
  • +
  • ba59030 (builder) - builder: upgrade go.mod
  • +
  • 1114dd7 (builder) - builder: bump common 1.1.2
  • +
  • fe50b62 (builder) - builder: change drycc gateway listener name
  • +
  • db3950c (builder) - builder: remove gateway route
  • +
  • 5a508bb (builder) - builder: use podman replace docker
  • +
  • bbb9029 (builder) - deps: bump golang.org/x/net from 0.12.0 to 0.17.0
  • +
  • f4e5d6c (builder) - builder: remove health url
  • +
  • 9111c8f (builder) - builder: remove io/ioutil
  • +
  • 1f36e3d (controller) - deps: bump django from 4.1.2 to 4.1.6 in /rootfs
  • +
  • e4ab434 (controller) - controller: use woodpecker replace drone
  • +
  • 9f0301e (controller) - deps: bump django from 4.1.6 to 4.1.7 in /rootfs
  • +
  • 3932423 (controller) - woodpecker: use woodpecker ci build status
  • +
  • ae8b6b4 (controller) - setting: support KUBERNETES_LIMITS env config
  • +
  • c10b9bc (controller) - controller: using the api_version instead of hard coding
  • +
  • e6908cd (controller) - controller: upgrade requirements
  • +
  • b0eba0c (controller) - controller: add route rules serializer
  • +
  • 2e4b6a4 (controller) - controller: add chart appVersion
  • +
  • 7d32b55 (controller) - controller: upgrade to bookworm
  • +
  • f2dc8dd (controller) - controller: add codename build-arg
  • +
  • 5739b83 (controller) - controller: use timescaledb replace influxdb
  • +
  • 53892cb (controller) - controller: add timeseries
  • +
  • 0fe0eae (controller) - controller: upgrade requirements
  • +
  • 18b2a91 (controller) - deps: bump aiohttp from 3.8.4 to 3.8.5 in /rootfs
  • +
  • f50874a (controller) - controller: bump common 1.1.2
  • +
  • 956cd08 (controller) - controller: change drycc gateway listener name
  • +
  • 9ab3ead (controller) - controller: remove passport url check
  • +
  • a24c7b0 (controller) - controller: remove gateway route
  • +
  • f7e539a (controller) - controller: change celery priority
  • +
  • ab77a52 (controller) - controller: use podman replace docker
  • +
  • 8e27501 (controller) - controller: dynamic app storage class
  • +
  • 385978b (controller) - controller: list_pods datetime format
  • +
  • b20362c (controller) - deps: bump django from 4.2.3 to 4.2.7 in /rootfs
  • +
  • e11ae1b (controller) - controller: add cluster migrate
  • +
  • ca6e9df (controller) - controller: async mount
  • +
  • 9a7fbfc (controller) - controller: remove FOSSA
  • +
  • 3d55279 (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs
  • +
  • d498a11 (controller) - controller: add measure loalancers
  • +
  • 249a985 (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs
  • +
  • b967f58 (controller) - deps: bump aiohttp from 3.8.6 to 3.9.0 in /rootfs (#107)
  • +
  • 8ca9ed6 (controller) - controller: no longer restrict reserved domain
  • +
  • 9ff6649 (database) - database: add init database configure
  • +
  • 9b4cd26 (database) - database: use dynamic clusterrole name
  • +
  • b59cde4 (database) - database: remove minio require
  • +
  • 86462f8 (database) - database: use woodpecker replace drone
  • +
  • 1e8555a (database) - database: add chart appVersion
  • +
  • 1b762d5 (database) - database: upgrade codename to bookworm
  • +
  • 9ffe1fd (database) - database: add codename build-arg
  • +
  • 69466d7 (database) - database: add database extension
  • +
  • beb4b62 (database) - database: bump common 1.1.2
  • +
  • 67e2714 (database) - database: use podman replace docker
  • +
  • 8f328f8 (fluentbit) - fluentbit: no limit buffer size for kube api
  • +
  • fc0552c (fluentbit) - fluentbit: use podman replace docker
  • +
  • 63a6cab (fluentbit) - fluentbit: change fluentbit match
  • +
  • 220f81a (fluentbit) - fluentbit: run as no-root
  • +
  • aec1393 (fluentbit) - fluentbit: change configmap name
  • +
  • 1af4fd2 (fluentbit) - fluentbit: change default stream name
  • +
  • bef90ad (gateway) - gateway: add route for gateway
  • +
  • d523ddb (gateway) - gateway: change drycc gateway listener name
  • +
  • d9137f4 (gateway) - gateway: add chart appVersion
  • +
  • 0425dd4 (gateway) - gateway: add customListeners
  • +
  • 3982b86 (imagebuilder) - imagebuilder: use woodpecker replace drone
  • +
  • 3e4e7a3 (imagebuilder) - imagebuilder: add chart appVersion
  • +
  • 8df6e8e (imagebuilder) - imagebuilder: upgrade stack version
  • +
  • a5601f7 (imagebuilder) - imagebuilder: add drycc_app env
  • +
  • 07465f8 (imagebuilder) - imagebuilder: upgrade to bookworm
  • +
  • 00d22d2 (imagebuilder) - imagebuilder: add codename build-arg
  • +
  • 0b7a24e (imagebuilder) - imagebuilder: upgrade podman/mc/caddy
  • +
  • a7d8be8 (imagebuilder) - imagebuilder: use podman replace docker
  • +
  • 6b2da83 (logger) - logger: use woodpecker replace drone
  • +
  • 8245b25 (logger) - woodpecker: use woodpecker ci build status
  • +
  • f811a74 (logger) - logger: add chart appVersion
  • +
  • 413f6f6 (logger) - logger: upgrade codename to bookworm
  • +
  • 2ac6b10 (logger) - logger: add codename build-arg
  • +
  • 2581426 (logger) - logger: bump redis to v9
  • +
  • 364b25a (logger) - logger: bump common 1.1.2
  • +
  • dc169a3 (logger) - logger: use fluentbit replace fluentd
  • +
  • d855d91 (logger) - logger: use podman replace docker
  • +
  • f767235 (monitor) - monitor: add off-cluster passport configure
  • +
  • ab23936 (monitor) - monitor: use dynamic clusterrole name
  • +
  • 47beee0 (monitor) - monitor: change tikv secret key
  • +
  • af7703f (monitor) - grafana: remove panel when component off-cluster
  • +
  • 1b870c2 (monitor) - monitor: use woodpecker replace drone
  • +
  • 4a5f1f1 (monitor) - grafana: up ldap api_url config
  • +
  • 143cabe (monitor) - monitor: add prometheus architecture diagram
  • +
  • 93091c2 (monitor) - woodpecker: use woodpecker ci build status
  • +
  • 0b7045a (monitor) - grafana: add dashboard kubernetes_deployment_metrics
  • +
  • 2fb1839 (monitor) - woodpecker: pipeline config VERSION, when build container image
  • +
  • e272416 (monitor) - monitor: add chart appVersion
  • +
  • abc0e53 (monitor) - monitor: upgrade codename to bookworm
  • +
  • 86cc01b (monitor) - monitor: add codename build-arg
  • +
  • 1cd849f (monitor) - monitor: add postgresql outputs
  • +
  • c3205c0 (monitor) - monitor: change default agent config
  • +
  • 8c802c0 (monitor) - monitor: add timeseries database
  • +
  • e9abc40 (monitor) - monitor: bump common 1.1.2
  • +
  • 6af66cd (monitor) - monitor: change drycc gateway listener name
  • +
  • d02d718 (monitor) - monitor: remove gateway route
  • +
  • 3509c29 (monitor) - monitor: use podman replace docker
  • +
  • ed7bfa2 (monitor) - monitor: optimize env PROMETHEUS_URL
  • +
  • da89bef (passport) - passport: charts codereview
  • +
  • 61c4a96 (passport) - passport: support init app config
  • +
  • 9101006 (passport) - passport: add initApplications to charts
  • +
  • 7dd7fa4 (passport) - passport: use woodpecker replace drone
  • +
  • 4400199 (passport) - woodpecker: use woodpecker ci build status
  • +
  • 6b2c546 (passport) - passport: change secret name to drycc-passport-auto-tls
  • +
  • c8bd824 (passport) - passport: upgrade requirements
  • +
  • aee5aef (passport) - passport: add chart appVersion
  • +
  • 2d81953 (passport) - passport: upgrade codename to bookworm
  • +
  • 9e66242 (passport) - passport: add codename build-arg
  • +
  • 0fca998 (passport) - passport: upgrade requirements
  • +
  • 3482528 (passport) - passport: bump common 1.1.2
  • +
  • 0c5ec93 (passport) - passport: change drycc gateway listener name
  • +
  • f7b8f53 (passport) - passport: remove gateway route
  • +
  • baf69da (passport) - passport: use podman replace docker
  • +
  • fcd45dd (passport) - passport: add cluster migrate
  • +
  • da6d32a (prometheus) - prometheus: add prometheus-config
  • +
  • 683de9e (prometheus) - prometheus: use podman replace docker
  • +
  • 3323300 (prometheus) - prometheus: remove gateway route
  • +
  • da1d356 (prometheus) - prometheus: change drycc gateway listener name
  • +
  • 4e7a936 (prometheus) - prometheus: bump common 1.1.2
  • +
  • 44c1c6f (prometheus) - prometheus: add codename build-arg
  • +
  • d1f1dda (prometheus) - prometheus: upgrade codename to bookworm
  • +
  • 0836fc1 (prometheus) - prometheus: add chart appVersion
  • +
  • 9e13232 (prometheus) - prometheus: add LICENSE
  • +
  • f53e14a (rabbitmq) - rabbitmq: remove auto user
  • +
  • 0ec7277 (rabbitmq) - rabbitmq: use woodpecker replace drone
  • +
  • f376a30 (rabbitmq) - woodpecker: use woodpecker ci build status
  • +
  • 51405d8 (rabbitmq) - rabbitmq: add chart appVersion
  • +
  • 463ca03 (rabbitmq) - rabbitmq: upgrade codename to bookworm
  • +
  • 1978a71 (rabbitmq) - rabbitmq: add codename build-arg
  • +
  • 139277f (rabbitmq) - rabbitmq: bump common 1.1.2
  • +
  • be49741 (rabbitmq) - rabbitmq: change drycc gateway listener name
  • +
  • 6d22518 (rabbitmq) - rabbitmq: remove gateway route
  • +
  • 0eb7833 (rabbitmq) - rabbitmq: add check shards
  • +
  • 9211063 (rabbitmq) - rabbitmq: erlang vm tuning optimization
  • +
  • 648a78d (rabbitmq) - rabbitmq: use podman replace docker
  • +
  • 0b43a4d (rabbitmq) - rabbitmq: add x-random exchange
  • +
  • ad1c4da (redis) - redis: use woodpecker replace drone
  • +
  • 3f37f92 (redis) - redis: add chart appVersion
  • +
  • e3bef7a (redis) - redis: upgrade codename to bookworm
  • +
  • 4e806d4 (redis) - redis: add codename build-arg
  • +
  • d5023be (redis) - redis: bump common 1.1.2
  • +
  • 98f5d6f (redis) - redis: use podman replace docker
  • +
  • 063f29e (registry) - registry: use woodpecker replace drone
  • +
  • 17bf8ae (registry) - woodpecker: use woodpecker ci build status
  • +
  • 7bbad15 (registry) - registry: add chart appVersion
  • +
  • 279154f (registry) - registry: upgrade codename to bookworm
  • +
  • 3e4ae84 (registry) - registry: add codename build-arg
  • +
  • fa322d6 (registry) - registry: bump common 1.1.2
  • +
  • 6c18fe0 (registry) - registry: use podman replace docker
  • +
  • 0bc8472 (registry) - registry: remove health url
  • +
  • 5dacd9f (registry) - registry: add wait-for-port check
  • +
  • fdeefc3 (registry) - registry: use headless
  • +
  • 08bf9f8 (registry) - registry: change registry port to 5000
  • +
  • 40bcea2 (registry) - registry: add registry push test
  • +
  • 871b8e7 (registry) - registry: add default env
  • +
  • 7f3b3ac (registry) - registry: bump registry 2.8.3
  • +
  • 569f15d (registry-proxy) - registry-proxy: use woodpecker replace drone
  • +
  • cc33caf (registry-proxy) - woodpecker: use woodpecker ci build status
  • +
  • 0002aab (registry-proxy) - registry-proxy: add chart appVersion
  • +
  • 40af10b (registry-proxy) - registry-proxy: upgrade codename to bookworm
  • +
  • c56b9df (registry-proxy) - registry-proxy: add codename build-arg
  • +
  • 9d5bfe0 (registry-proxy) - registry-proxy: use podman replace docker
  • +
  • e6a3350 (registry-proxy) - registry-proxy: change worker_processes to 1
  • +
  • 726f39d (storage) - storage: add volume compactionMBps
  • +
  • a5aa2d8 (storage) - storage: add threshold to vacuum and reclaim spaces
  • +
  • e687d04 (storage) - storage: delete disk type in single disk case
  • +
  • 75ee2e4 (storage) - storage: change datanode replicas to 4
  • +
  • c5fd7ba (storage) - storage: delete useless env
  • +
  • b3826ea (storage) - storage: add ssd hdd dir
  • +
  • 29881a0 (storage) - storage: add balance cronjob
  • +
  • c5a0f51 (storage) - storage: add defaultReplication for seaweedfs master
  • +
  • 543c7a2 (timeseries) - timeseries: use podman replace docker
  • +
  • 5376024 (timeseries) - timeseries: update timeseries-service-replica
  • +
  • 52e8520 (timeseries) - timeseries: bump common 1.1.2
  • +
  • f82657c (timeseries) - timeseries: add start script
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.6.0

+
New Drycc Workflow Release v1.6.0
+ +

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.

+

Workflow ## v1.5.0 -> v1.6.0

+

Releases

+
    +
  • builder v1.3.0 -> v1.4.0
  • +
  • controller v1.4.0 -> v1.5.0
  • +
  • passport v1.0.0 -> v1.1.0
  • +
  • database v1.1.0 -> v1.2.0
  • +
  • imagebuilder v1.0.1 -> v1.1.0
  • +
  • fluentd v1.2.0 -> v1.3.0
  • +
  • logger v1.2.0 -> v1.3.0
  • +
  • storage v1.2.0 -> v1.3.0
  • +
  • monitor v1.2.0 -> v1.3.0
  • +
  • redis v1.2.0 -> v1.3.0
  • +
  • influxdb v1.1.0 -> v1.2.0
  • +
  • rabbitmq v1.0.0 -> v1.1.0
  • +
  • registry v1.1.0 -> v1.2.0
  • +
  • registry-proxy v1.1.0 -> v1.2.0
  • +
+

Features

+
    +
  • 52517d9 (builder) - builder: update controller-sdk-go
  • +
  • 1d78ca0 (builder) - builder: add affinity
  • +
  • 26b6980 (builder) - builder: switch charts to oci
  • +
  • bfd4385 (controller) - controller: add get manager user status
  • +
  • 874208d (controller) - controller: unified measurement model
  • +
  • cadf98f (controller) - controller: add admission webhook
  • +
  • e0050c2 (controller) - controller: new measurement model
  • +
  • a11ba58 (controller) - controller: multi pod restart uses async
  • +
  • fb3c15d (controller) - controller: add check app owner status
  • +
  • 3d78b76 (controller) - controller: add resource services api
  • +
  • 3d6a201 (controller) - controller: add search apps api
  • +
  • 01c443a (controller) - controller: add KUBERNETES_CPU_MEMORY_RATIO parameter
  • +
  • 7c26232 (controller) - controller: add volume size limit
  • +
  • 3bee749 (controller) - controller: add annotations support
  • +
  • 23cd97c (controller) - controller: traefik v2 support
  • +
  • e37b7db (controller) - controller: add affinity
  • +
  • b3b367b (controller) - controller: add volume expand support
  • +
  • a4e154a (controller) - controller: add database replica support
  • +
  • 2f37216 (controller) - controller: switch wsgi to asgi
  • +
  • b3314a5 (controller) - controller: add pod exec api
  • +
  • 75df2dc (controller) - controller: add stream support for app logs
  • +
  • 4229bad (controller) - ccontroller: switch charts to oci
  • +
  • 89bb19b (database) - database: upgrade to pg14
  • +
  • 9f45a5d (database) - database: add hugepages support
  • +
  • c4008c9 (database) - database: add affinity
  • +
  • 411a7b2 (database) - postgres: use patroni
  • +
  • 64e5cb0 (database) - database: switch charts to oci
  • +
  • 2bab823 (fluentd) - fluentd: switch charts to oci
  • +
  • 337ba62 (imagebuilder) - imagebuilder: run podman as rootless
  • +
  • 4396ffa (imagebuilder) - imagebuilder: switch to oci charts
  • +
  • f37ae09 (influxdb) - influxdb: add affinity
  • +
  • 04503b2 (influxdb) - influxdb: add influxdb ha
  • +
  • 41ddad5 (influxdb) - influxdb: switch charts to oci
  • +
  • 2006480 (logger) - logger: use redis stream replace nsqd
  • +
  • ab23d17 (logger) - logger: add affinity
  • +
  • 81d4e9d (logger) - logger: switch charts to oci
  • +
  • c3d9796 (monitor) - monitor: add affinity
  • +
  • cd9de3c (monitor) - monitor: switch to oci charts
  • +
  • 318a73f (passport) - passport: add change user confirm
  • +
  • 79ef100 (passport) - passport: add re login at authorize
  • +
  • 6927bb5 (passport) - passport: add affinity
  • +
  • 3146a09 (passport) - passport: add google reCAPTCHA
  • +
  • 802abcd (passport) - passport: add replica database support
  • +
  • a0dcd1b (passport) - passport: switch wsgi to asgi
  • +
  • 4c9dbba (passport) - passport: switch charts to oci
  • +
  • 74825f7 (rabbitmq) - rabbitmq: add rabbitmq managentment ingress
  • +
  • 12cf7d6 (rabbitmq) - rabbitmq: add affinity
  • +
  • 103417d (rabbitmq) - rabbitmq: switch charts to oci
  • +
  • 5d428bb (redis) - redis: add affinity
  • +
  • a88c1a9 (redis) - redis: switch charts to oci
  • +
  • 541585d (registry) - registry: add affinity
  • +
  • e9ca9d4 (registry) - registry: add garbage-collect cronjob
  • +
  • ec62a59 (registry) - registry: switch charts to oci
  • +
  • fde0b07 (registry-proxy) - registry-proxy: switch charts to oci
  • +
  • be14eb4 (storage) - minio: add affinity
  • +
  • 51af696 (storage) - storage: add k8s csi support
  • +
  • 76a75d9 (storage) - storage: add cluster health checker
  • +
  • a17dc8c (storage) - storage: switch charts to oci
  • +
+

Fixes

+
    +
  • e4f44fb (builder) - builder: no error return
  • +
  • e38dfc7 (builder) - builderControllerHost/ControllerPort init error
  • +
  • ff9069f (controller) - controller: influxdb query error
  • +
  • f7f5069 (controller) - controller: authentication 500
  • +
  • 7e297a8 (controller) - controller: add check remote user status
  • +
  • 9db28e1 (controller) - controller: celery MaxRetriesExceededError
  • +
  • 4bcff08 (controller) - controller: wrong name
  • +
  • d69fde2 (controller) - controller: traefik ingress create error
  • +
  • a3ad743 (controller) - fixup(controller: user login error
  • +
  • 662c8dd (controller) - controller: change influxdb port
  • +
  • 957bdf6 (controller) - controller: validate rsa key pairing before storage
  • +
  • 419ec4c (controller) - controller: kubernetes pod/exec cluster role
  • +
  • a67edaa (controller) - controller: Cannot routing:disable
  • +
  • e09e214 (controller) - controller: allowlist cannot remove
  • +
  • 318b126 (controller) - controller: domains update error
  • +
  • 92855eb (database) - database: premission denied
  • +
  • bde945a (database) - fixup(postgres: support arm, fix Failed to build psutil
  • +
  • 7854d45 (database) - fixup(postgres: user name converted to lowercase letters
  • +
  • 57b2a07 (fluentd) - fluentd: ifconfig_path not found
  • +
  • 20e72b9 (imagebuilder) - imagebuilder: upgrade pack version
  • +
  • 651db8a (imagebuilder) - imagebuilder: chown uid gid order
  • +
  • d2e9164 (influxdb) - influxdb: proxy not running
  • +
  • 3a1d361 (monitor) - monitor: charts naming
  • +
  • d754ae0 (monitor) - monitor: telegraf init error
  • +
  • 63f9e34 (monitor) - monitor: affinity error
  • +
  • 95ae1e5 (passport) - passport: yarn build fail
  • +
  • 3f5365e (passport) - passport: wrong name
  • +
  • 907f17b (passport) - passport: change uid gid to 1001
  • +
  • e3911e0 (passport) - passport: ‘registration_done’ not found
  • +
  • 2ace5f0 (passport) - passport: ui style
  • +
  • b3ba1e1 (passport) - passport privacy policy link
  • +
  • 172e9c8 (passport) - passport: check databaseReplicaUrl error
  • +
  • a3aeb70 (rabbitmq) - passport: change uid gid to 1001
  • +
  • 5c73dcf (redis) - reids: DRYCC_REGISTY misspelling
  • +
  • d7e3baf (redis) - redis: env miss
  • +
  • cadaa91 (registry) - registry: set gid uid to 1001
  • +
  • d524217 (registry) - registry: storage run error
  • +
  • 854f912 (registry) - registry: chown uid gid order
  • +
  • e642bb7 (registry-proxy) - registry-proxy: containerPort error
  • +
  • 8dfd029 (registry-proxy) - registry-proxy: chown uid gid order
  • +
  • bbea364 (storage) - minio: premission denied
  • +
  • 97deba1 (storage) - storage: node unimplemented error
  • +
  • b9bdeff (storage) - storage: pd can not connect each other
  • +
+

Style

+
    +
  • 1edb10c (controller) - controller: database convention over configuration
  • +
  • 1960cc3 (database) - database: database name convention over configuration
  • +
  • 06d1f5d (imagebuilder) - imagebuilder: URL to Url
  • +
  • b8a8941 (passport) - passport: database convention over configuration
  • +
+

Maintenance

+
    +
  • 8e9a199 (builder) - builder: upgrade controller-sdk-go
  • +
  • 4840151 (builder) - builder: use exec runner replace docker runner
  • +
  • 68ccfb1 (builder) - builder: canonical charts naming
  • +
  • 8f971cb (builder) - builder: provide any additional service annotations
  • +
  • fe2c55d (builder) - dockerfile: use drycc/base image
  • +
  • 2b5e706 (builder) - dockerfile: change user and workdir
  • +
  • 7a6c8d3 (builder) - builder: set gid uid to 1001
  • +
  • fe494f7 (builder) - dockerfile: use uid gid
  • +
  • a7c8752 (builder) - builder: change nodes to pod affinity
  • +
  • eb2e94c (builder) - database: bump mc 2022.04.01.23.44.48
  • +
  • cfaae66 (builder) - builder: use registry.drycc.cc replace docker.io
  • +
  • d7d2890 (builder) - builder: change default imagebuilder registry
  • +
  • ecfdb19 (builder) - imagebuilder: change python-dev registry
  • +
  • 6da17f4 (builder) - builder: https://github.com/minio/minio/issues/14331
  • +
  • 1a57e5b (builder) - builder: https://github.com/minio/minio/issues/14331
  • +
  • f1464fa (builder) - builder: https://github.com/minio/minio/issues/13799
  • +
  • b1e1c4f (builder) - builder: use env replace creds volume
  • +
  • 71a4145 (builder) - builder: bump go.mod
  • +
  • 3567688 (builder) - builder: fine management affinity
  • +
  • 73ea38b (builder) - builder: change storage to minio
  • +
  • 1f91321 (builder) - builder: use testify replace assert
  • +
  • d148b9c (builder) - builder: add check storage health
  • +
  • b768101 (builder) - builder: change initContainers
  • +
  • 1b3bec3 (builder) - builder: add replicas
  • +
  • 5cb0d61 (builder) - builder: upgrade to latest controller-sdk-go
  • +
  • 98b9d58 (builder) - builder: upgrade new require
  • +
  • 65817c3 (builder) - builder: change drycc.cc to www.drycc.cc
  • +
  • 4e3f9d0 (controller) - controller: add celery retry mechanism
  • +
  • f6716fe (controller) - controller: change cronjob name
  • +
  • eb60693 (controller) - controller: refine celery task priority
  • +
  • 66905e9 (controller) - controller: change manager auth
  • +
  • ea20c41 (controller) - controller: remove start/stop api
  • +
  • 4c8fc80 (controller) - controller: improve tasks error handling
  • +
  • cf7402e (controller) - controller: add blocklist api
  • +
  • 80f14dd (controller) - controller: use get_user_model replace auth.User
  • +
  • ffc7bb7 (controller) - controller: use JSONField replace ArrayField
  • +
  • 370df8c (controller) - controller: add validate metric
  • +
  • 29084ce (controller) - controller: use user id request manager api
  • +
  • 718fe12 (controller) - controller change urlpatterns order
  • +
  • 71f4042 (controller) - controller: measurements uses lowercase letters
  • +
  • e5123ea (controller) - controller: change resource unit to number
  • +
  • 18fee9a (controller) - deps: bump celery from 5.1.2 to 5.2.2 in /rootfs
  • +
  • ffca6c1 (controller) - controller: use exec runner replace docker runner
  • +
  • 9ec12e1 (controller) - controller: simplify drone configuration
  • +
  • 4b4749e (controller) - controller: set default CSRF_COOKIE_SECURE false
  • +
  • 2ef6338 (controller) - deps: bump django from 3.2.5 to 3.2.10 in /rootfs
  • +
  • c7570d0 (controller) - deps: bump django from 3.2.10 to 3.2.11 in /rootfs
  • +
  • 8b17bc1 (controller) - controller: canonical charts naming
  • +
  • c928fb0 (controller) - controller: use rabbitmq cluster
  • +
  • f917185 (controller) - controller: provide any additional service annotations
  • +
  • 22a8f63 (controller) - deps: bump django from 3.2.11 to 3.2.12 in /rootfs
  • +
  • 3cc3b00 (controller) - dockerfile: use drycc/base image
  • +
  • ee274f6 (controller) - controller: set venv profile
  • +
  • ce6b069 (controller) - controller: set gid uid to 1001
  • +
  • 3a105d3 (controller) - dockerfile: use uid gid
  • +
  • 15f9b0e (controller) - controller: code review
  • +
  • 01e6fd9 (controller) - controller: use passport user id
  • +
  • 893ee31 (controller) - oauth2: update user info pipline
  • +
  • 3028fb4 (controller) - user: set AnonymousUser username
  • +
  • 5daf82d (controller) - controller: set worker_cancel_long_running_tasks_on_connection_loss
  • +
  • 61f2c53 (controller) - controller: change nodes to pod affinity
  • +
  • 88feb1d (controller) - imagebuilder: python=3.10.4 rabbitmq=3.9.14
  • +
  • 914e03f (controller) - controller: use registry.drycc.cc replace docker.io
  • +
  • a5bb548 (controller) - controller: change python-dev registry
  • +
  • 3ecdd7c (controller) - controller: add a separate rabbitmqUrl configuration
  • +
  • 967cb11 (controller) - controller: remove APP_STORAGE
  • +
  • 473d2b5 (controller) - controller: use env replace creds volume
  • +
  • e410d4c (controller) - deps: bump django from 3.2.12 to 3.2.13 in /rootfs
  • +
  • c6ef777 (controller) - controller: simplified passport config
  • +
  • 0fd3233 (controller) - controller: remove settings hardcode
  • +
  • a64e99c (controller) - controller: change passport config
  • +
  • 62aba25 (controller) - controller: set cronjob timezone to utc
  • +
  • 760b70b (controller) - controller: change default ratio
  • +
  • 8dffc3a (controller) - controller: fine management affinity
  • +
  • 26043c4 (controller) - controller: change default app storage
  • +
  • 608bd8d (controller) - deps: bump django from 3.2.13 to 3.2.14 in /rootfs
  • +
  • 18ed0c2 (controller) - controller: remove conjob affinity
  • +
  • add6712 (controller) - controller: add volume expand support use patch
  • +
  • cc1ad13 (controller) - controller: add startupProbe
  • +
  • 0e9a603 (controller) - controller: add clearsocial cronjob
  • +
  • eb6f05d (controller) - controller: change initContainers
  • +
  • 762c676 (controller) - controller: change replicas
  • +
  • abd7e8c (controller) - deps: bump django from 3.2.14 to 3.2.15 in /rootfs
  • +
  • 07fdf1b (controller) - controller: remove database conn_max_age
  • +
  • ef8e41f (controller) - controller: add database replica check
  • +
  • 79143f2 (controller) - controller: upgrade new require
  • +
  • a624048 (controller) - controller: add app.refresh func annotation
  • +
  • b22d367 (controller) - controller: optimize app refresh timing
  • +
  • fe98f0c (database) - database: use exec runner replace docker runner
  • +
  • 5e00c11 (database) - database: canonical charts naming
  • +
  • d2cb860 (database) - database: disable huge_pages
  • +
  • 197d80d (database) - database: add persistence
  • +
  • 1c3e645 (database) - database: provide any additional service annotations
  • +
  • 37730ab (database) - dockerfile: use drycc/base image
  • +
  • 5014112 (database) - dockerfile: change entrypoint
  • +
  • 29b538e (database) - database: change nodes to pod affinity
  • +
  • c2bb074 (database) - database: bump python 3.10.4 and mc 2022.04.01.23.44.48
  • +
  • 077a4e9 (database) - database: use registry.drycc.cc replace docker.io
  • +
  • 560bdb9 (database) - database: change python-dev registry
  • +
  • 1e54b55 (database) - database: https://github.com/minio/minio/issues/14331
  • +
  • d646672 (database) - database: https://github.com/minio/minio/issues/13799
  • +
  • a6ac4e3 (database) - database: use env replace creds volume
  • +
  • 9618d87 (database) - database: fine management affinity
  • +
  • b823273 (database) - database: change minio to storage
  • +
  • 7bd5a90 (database) - database: add check storage health
  • +
  • 20c6d96 (database) - database: fix storage run error
  • +
  • 8bde830 (database) - database: upgrade to pg 14.5
  • +
  • a33b5e5 (fluentd) - fluentd: update plugins
  • +
  • eed7a78 (fluentd) - fluentd: update filter kubernetes setting
  • +
  • cc83dd8 (fluentd) - fluentd: update elasticsearch store setting and support exclude specific container logs
  • +
  • ba2feb2 (fluentd) - fluentd: use exec runner replace docker runner
  • +
  • d528676 (fluentd) - fluentd: simplify drone configuration
  • +
  • dece82d (fluentd) - fluentd: canonical charts naming
  • +
  • 4e0a802 (fluentd) - fluend: replace nsqd with redis
  • +
  • 15ceca0 (fluentd) - dockerfile: use drycc/base image
  • +
  • a7f619f (fluentd) - dockerfile: change workdir
  • +
  • 9adf5ed (fluentd) - database: bump fluentd 1.14.6
  • +
  • 50c14c2 (fluentd) - fluentd: use registry.drycc.cc replace docker.io
  • +
  • 83171b1 (fluentd) - fluentd: change python-dev registry
  • +
  • ec83581 (fluentd) - fluentd: unified reids declaration
  • +
  • 07c63e2 (fluentd) - fluentd: upgrade fluentd 1.15.2
  • +
  • 65df9be (imagebuilder) - imagebuilder: update pack version
  • +
  • 66cab35 (imagebuilder) - imagebuilder: use dind replace go-dev
  • +
  • 0c82060 (imagebuilder) - imagebuilder: use exec runner replace docker runner
  • +
  • 8146da9 (imagebuilder) - imagebuilder: canonical charts naming
  • +
  • 7d97241 (imagebuilder) - dockerfile: use drycc/base image
  • +
  • 07e805c (imagebuilder) - imagebuilder: change default buildpack
  • +
  • 8d1038d (imagebuilder) - imagebuilder: upgrade podman to 4.0.1
  • +
  • 62d3687 (imagebuilder) - imagebuilder: change workdir to /workspace
  • +
  • da8bfb0 (imagebuilder) - imagebuilder: change uid gid to 1001
  • +
  • d44e3bc (imagebuilder) - imagebuilder: upgrade stack
  • +
  • 5b0c7e6 (imagebuilder) - imagebuilder: use registry.drycc.cc replace docker.io
  • +
  • f74cbf6 (imagebuilder) - imagebuilder: add defaultBuildpacksURL
  • +
  • 941d493 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/14331
  • +
  • 449be91 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/13799
  • +
  • 63b0523 (imagebuilder) - imagebuilder: use env replace creds volume
  • +
  • 4e8a6e5 (imagebuilder) - imagebuilder: add imagebuilder config
  • +
  • 2d891f5 (imagebuilder) - imagebuilder: change minio to storage
  • +
  • addceda (imagebuilder) - imagebuilder: upgrade new require
  • +
  • a6e569f (imagebuilder) - imagebuilder: pack_build add –env-file parameter
  • +
  • 6191ff5 (influxdb) - influxdb: use exec runner replace docker runner
  • +
  • dc3f8c7 (influxdb) - influxdb: canonical charts naming
  • +
  • 6b5c819 (influxdb) - influxdb: new ingress style
  • +
  • 68b381d (influxdb) - influxdb: provide any additional service annotations
  • +
  • ea20eb8 (influxdb) - dockerfile: use drycc/base image
  • +
  • 64c0a71 (influxdb) - influxdb: set gid uid to 1001
  • +
  • a709ca1 (influxdb) - influxdb: use DRYCC_UID DRYCC_GID env
  • +
  • 740dff0 (influxdb) - influxdb: use common affinity template
  • +
  • e035673 (influxdb) - influxdb: change nodes to pod affinity
  • +
  • f1cefbd (influxdb) - influxdb: use registry.drycc.cc replace docker.io
  • +
  • a00100e (influxdb) - influxdb: fine management affinity
  • +
  • 9d165ef (influxdb) - influxdb: add probe
  • +
  • bee7fff (influxdb) - influxdb: upgrade to influxdb 2.4.0
  • +
  • 254914c (logger) - logger: use exec runner replace docker runner
  • +
  • 8d91c68 (logger) - logger: canonical charts naming
  • +
  • b6d2182 (logger) - logger: provide any additional service annotations
  • +
  • c35e59a (logger) - dockerfile: use drycc/base image
  • +
  • a63c070 (logger) - logger: change workdir to /workspace
  • +
  • a594b28 (logger) - logger: set gid uid to 1001
  • +
  • 9a90e22 (logger) - dockerfile: use uid gid
  • +
  • 36493b4 (logger) - logger: use common affinity template
  • +
  • 897a3a5 (logger) - logger: change nodes to pod affinity
  • +
  • 03b32ab (logger) - logger: use registry.drycc.cc replace docker.io
  • +
  • a50ba5f (logger) - logger: change python-dev registry
  • +
  • 23187a3 (logger) - logger: unified reids declaration
  • +
  • aaa129a (logger) - logger: fine management affinity
  • +
  • be4f656 (logger) - logger: add replicas
  • +
  • 7c25459 (logger) - charts: add NetworkPolicy
  • +
  • 6810149 (logger) - logger: remove memory storage
  • +
  • a918c50 (logger) - logger: add .vscode to .gitignore
  • +
  • a415210 (logger) - logger: add log follow support
  • +
  • 59b1da3 (logger) - logger: upgrade new require
  • +
  • 27cc151 (monitor) - monitor: use exec runner replace docker runner
  • +
  • 07d6a9d (monitor) - monitor: canonical charts naming
  • +
  • 1054357 (monitor) - monitor: use redis default port
  • +
  • e3673df (monitor) - monitor: remove nsqd
  • +
  • fc9dd3e (monitor) - monitor: new ingress style
  • +
  • 856a898 (monitor) - monitor: add default user env
  • +
  • 9857535 (monitor) - monitor: add random user
  • +
  • 38b5a04 (monitor) - grafana: oauth auto login
  • +
  • 5dfc579 (monitor) - monitor: upgrade version
  • +
  • e121b5a (monitor) - monitor: provide any additional service annotations
  • +
  • 84462a0 (monitor) - dockerfile: use drycc/base image
  • +
  • b9e8ce8 (monitor) - monitor: chore(imagebuilder): change uid gid to 1001
  • +
  • 05ee8ab (monitor) - dockerfile: use uid gid
  • +
  • e1fa68e (monitor) - monitor: use common affinity template
  • +
  • b8f302b (monitor) - monitor: change nodes to pod affinity
  • +
  • 4fc991f (monitor) - database: bump telegraf 1.22.0 and grafana 8.4.5
  • +
  • 21a2f6a (monitor) - monitor: use registry.drycc.cc replace docker.io
  • +
  • acc976f (monitor) - monitor: change python-dev registry
  • +
  • 62d76c1 (monitor) - monitor: unified reids declaration
  • +
  • b3c57ad (monitor) - monitor: optimize oauth2 configuration
  • +
  • 70af6b0 (monitor) - monitor: change passport config
  • +
  • 69f9a88 (monitor) - monitor: fine management affinity
  • +
  • 2fb278f (monitor) - monitor: rename influxdb port
  • +
  • 17548ff (monitor) - grafana: update dashborad
  • +
  • 69d7bbd (monitor) - grafana: influx dashborad disk size
  • +
  • 75db1b0 (monitor) - monitor: upgrade new grafana/telegraf
  • +
  • 80504a1 (monitor) - grafana: update influx and redis dashboard
  • +
  • f7078cb (monitor) - monitor:chown use env
  • +
  • 91ae0dd (passport) - passport: optimize login display
  • +
  • 2d3bbbc (passport) - passport: change drycc logo
  • +
  • 59790a7 (passport) - passport: make user email unique
  • +
  • faea034 (passport) - passport: use strtobool
  • +
  • 1fbf2bc (passport) - passport: use yarn replace npm
  • +
  • 119cac8 (passport) - passport: use exec runner replace docker runner
  • +
  • cff5062 (passport) - passport: set default CSRF_COOKIE_SECURE false
  • +
  • 9cc0210 (passport) - passport: canonical charts naming
  • +
  • 9ab3896 (passport) - passport: new ingress style
  • +
  • 259ccc9 (passport) - passport: provide any additional service annotations
  • +
  • af1bbcd (passport) - dockerfile: use drycc/base image
  • +
  • 9ae5373 (passport) - passport: set venv profile
  • +
  • 8f61090 (passport) - dockerfile: use uid gid
  • +
  • fcaf72d (passport) - passport: upgrade npm package
  • +
  • 546dcd5 (passport) - passport: add license
  • +
  • 4bda2d6 (passport) - passport: use minify
  • +
  • 73b0fd1 (passport) - passport: use common affinity template
  • +
  • 278fe7a (passport) - passport: change nodes to pod affinity
  • +
  • 3cd93d3 (passport) - passport: add reactive
  • +
  • 370b493 (passport) - passport: add footer
  • +
  • 483cbd6 (passport) - passport: use h_captcha replace re_captcha
  • +
  • 3d1675e (passport) - database: bump python 3.10.4 and node 16.14.2
  • +
  • 86a7835 (passport) - passport: use registry.drycc.cc replace docker.io
  • +
  • 2d65355 (passport) - passport: change python-dev registry
  • +
  • 90c1444 (passport) - passport: unified reids declaration
  • +
  • 2e0e417 (passport) - passport: fix firefox footer
  • +
  • ad274be (passport) - passport: use bulecss
  • +
  • f986d8b (passport) - passport: add main footer
  • +
  • 3e52867 (passport) - passport: dynamic settings for vue
  • +
  • 38adabc (passport) - passport: change passport config
  • +
  • f8d6b60 (passport) - passport: fine management affinity
  • +
  • 2cbd79d (passport) - passport: remove database conn_max_age
  • +
  • 7122797 (passport) - passport: change drycc.cc to www.drycc.cc
  • +
  • 8cc84cd (rabbitmq) - rabbitmq: use exec runner replace docker runner
  • +
  • f35930f (rabbitmq) - rabbitmq: add rabbitmq cluster support
  • +
  • fbfa3ba (rabbitmq) - rabbitmq: canonical charts naming
  • +
  • ca60701 (rabbitmq) - rabbitmq: use volumeClaimTemplates
  • +
  • fe5d1b4 (rabbitmq) - rabbitmq: add sharding support
  • +
  • 9c4ab97 (rabbitmq) - rabbitmq: provide any additional service annotations
  • +
  • 348a88a (rabbitmq) - dockerfile: use drycc/base image
  • +
  • 2388be1 (rabbitmq) - rabbitmq: upgrade erlang to 24.2.2
  • +
  • db2eaa5 (rabbitmq) - dockerfile: use uid gid
  • +
  • 772afd1 (rabbitmq) - rabbitmq: change to wait pid file
  • +
  • 2bfc25e (rabbitmq) - rabbitmq: use common affinity template
  • +
  • 11d505e (rabbitmq) - rabbitmq: change nodes to pod affinity
  • +
  • 69d63f1 (rabbitmq) - database: bump erlang 24.3.3 and rabbitmq 3.9.14
  • +
  • 8380299 (rabbitmq) - rabbitmq: use registry.drycc.cc replace docker.io
  • +
  • b3f69f1 (rabbitmq) - rabbitmq: add check rabbitmqLocaltion
  • +
  • 5327c76 (rabbitmq) - rabbitmq: fine management affinity
  • +
  • 5c66b5a (rabbitmq) - rabbitmq: change probe
  • +
  • 27bebf9 (rabbitmq) - rabbitmq: add start-rabbitmq script
  • +
  • 86ee6a7 (rabbitmq) - rabbitmq: upgrade to rabbitmq 3.10.7
  • +
  • 1f29683 (redis) - redis: use exec runner replace docker runner
  • +
  • a5041fc (redis) - redis: canonical charts naming
  • +
  • 64468c2 (redis) - redis: add redis persistence
  • +
  • de5d753 (redis) - redis: provide any additional service annotations
  • +
  • f644639 (redis) - dockerfile: use drycc/base image
  • +
  • 98051d2 (redis) - redis: premission denied
  • +
  • bcb548e (redis) - dockerfile: use uid gid
  • +
  • 524aa41 (redis) - redis: use common affinity template
  • +
  • 26c9466 (redis) - redis: change nodes to pod affinity
  • +
  • b67d7a2 (redis) - redis: use registry.drycc.cc replace docker.io
  • +
  • 839ec50 (redis) - redis: use env replace creds volume
  • +
  • 237ca86 (redis) - redis: fine management affinity
  • +
  • bdd968d (redis) - redis: upgrade neew require
  • +
  • 8b2910f (registry) - registry: use exec runner replace docker runner
  • +
  • eedbe78 (registry) - registry: canonical charts naming
  • +
  • 0241615 (registry) - registry: provide any additional service annotations
  • +
  • 9b58da4 (registry) - dockerfile: use drycc/base image
  • +
  • ab6acb7 (registry) - registry: change workdir to /workspace
  • +
  • f368bf7 (registry) - registry: use DRYCC_UID DRYCC_GID env
  • +
  • f4b9041 (registry) - registry: use common affinity template
  • +
  • c2e87ca (registry) - registry: change nodes to pod affinity
  • +
  • feb6aba (registry) - database: bump mc 2022.04.01.23.44.48
  • +
  • 956932b (registry) - rregistry: use registry.drycc.cc replace docker.io
  • +
  • deda8d8 (registry) - registry: move registry-secret.yaml from workflow to registry
  • +
  • f52c7bf (registry) - registry: change python-dev registry
  • +
  • 007fe03 (registry) - registry: https://github.com/minio/minio/issues/14331
  • +
  • d620c6d (registry) - registry: https://github.com/minio/minio/issues/13799
  • +
  • 85e6b73 (registry) - registry: use env replace creds volume
  • +
  • 6a1155d (registry) - registry: fine management affinity
  • +
  • 7b8ebae (registry) - registry: change minio to storage
  • +
  • 1338951 (registry) - registry: add check storage health
  • +
  • 2fa769d (registry) - registry: change probe
  • +
  • f187cbf (registry) - registry: add replicas
  • +
  • 09d8a7b (registry) - registry: upgrade to mc 2022.08.28.20.08.11
  • +
  • 4b187b8 (registry-proxy) - registry-proxy: use exec runner replace docker runner
  • +
  • 29ffbbe (registry-proxy) - registry-proxy: canonical charts naming
  • +
  • 6d783ba (registry-proxy) - registry-proxy: remove use_cni
  • +
  • 8cf05cf (registry-proxy) - dockerfile: use drycc/base image
  • +
  • 090e286 (registry-proxy) - registry-proxy: chore(imagebuilder): change uid gid to 1001
  • +
  • 7cf6120 (registry-proxy) - registry-proxy: use DRYCC_UID DRYCC_GID env
  • +
  • 3a00697 (registry-proxy) - registry-proxy: use registry.drycc.cc replace docker.io
  • +
  • 30e69e8 (registry-proxy) - registry-proxy: add registry basic auth proxy
  • +
  • 942abce (registry-proxy) - registry-proxy: upgrade to nginx 1.23.1
  • +
  • 5ea3297 (storage) - minio: use exec runner replace docker runner
  • +
  • 8306add (storage) - minio: canonical charts naming
  • +
  • c917e9f (storage) - minio: provide any additional service annotations
  • +
  • 042c732 (storage) - dockerfile: use drycc/base image
  • +
  • 7b47b82 (storage) - minio: change workdir to /workspace
  • +
  • 6f3531e (storage) - minio: use DRYCC_UID DRYCC_GID env
  • +
  • 9795fb1 (storage) - minio: use common affinity template
  • +
  • a7b09c5 (storage) - minio: change nodes to pod affinity
  • +
  • 7607342 (storage) - database: bump mc 2022.04.01.23.44.48 and minio 2022.04.01.03.41.39
  • +
  • ea2b2f1 (storage) - minio: use registry.drycc.cc replace docker.io
  • +
  • 445b501 (storage) - minio: https://github.com/minio/minio/issues/14331
  • +
  • f19fbc7 (storage) - minio: use env replace creds volume
  • +
  • 8982e2e (storage) - minio: use minio to distributed
  • +
  • 06bec73 (storage) - minio: fine management affinity
  • +
  • 9b8f006 (storage) - storage: remove assert
  • +
  • 59d64b9 (storage) - storage: change listen to POD_IP
  • +
  • 60044ee (storage) - storage: add juicefs mount options
  • +
  • 189f944 (storage) - storage: remove volumeName
  • +
  • 302fe89 (storage) - storage: mv to minio dir
  • +
  • 6ec586d (storage) - storage: change readinessProbee andlivenessProbe
  • +
  • 0e028df (storage) - storage: add minio pdb
  • +
  • cf9bd2d (storage) - storage: add check storage health svc
  • +
  • 2dd5c9f (storage) - storage: add volumeBindingMode
  • +
  • fa2effc (storage) - storage: remove databaseBucket
  • +
  • d166cc7 (storage) - charts: format network-policy name
  • +
  • d06bcce (storage) - storage: upgrade to golang 1.19
  • +
  • c2ca05c (storage) - storage: upgrade new require
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.5.0

+
New Drycc Workflow Release v1.5.0
+ +

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.

+

Workflow ## v1.4.0 -> v1.5.0

+

Releases

+
    +
  • passport v1.0.0
  • +
  • rabbitmq v1.0.0
  • +
  • imagebuilder v1.0.0
  • +
  • builder v1.2.0 -> v1.3.0
  • +
  • controller v1.3.0 -> v1.4.0
  • +
  • database v1.0.2 -> v1.1.0
  • +
  • fluentd v1.1.0 -> v1.2.0
  • +
  • redis v1.1.0 -> v1.2.0
  • +
  • influxdb v1.0.1 -> v1.1.0
  • +
  • logger v1.1.0 -> v1.2.0
  • +
  • minio v1.1.0 -> v1.2.0
  • +
  • monitor v1.1.0 -> v1.2.0
  • +
  • nsqd v1.1.0 -> v1.2.0
  • +
  • registry v1.0.3 -> v1.1.0
  • +
  • registry-proxy v1.0.2 -> v1.1.0
  • +
+

Features

+
    +
  • 0f5f8e4 (builder) - builder: multi-platform support
  • +
  • f269d06 (builder) - build: add buildx supportjkjkk:q
  • +
  • 5e72fe8 (builder) - registry: use docker build
  • +
  • 25d8a4c (builder) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 7a3e1c5 (builder) - charts: set the default chart version
  • +
  • 46b75ff (builder) - builder: add cloud native buildpacks support
  • +
  • 2db2054 (builder) - builder: unified build model
  • +
  • 4b7f9d9 (builder) - builder: add initContainers
  • +
  • b78c936 (controller) - token: add get token api
  • +
  • bac52a5 (controller) - tasks: use celery replace nsqd
  • +
  • b9b0c58 (controller) - build: add buildx support
  • +
  • 205dcb3 (controller) - influxdb: add influxdb client
  • +
  • ff15849 (controller) - influxdb: upgrade to influxdb 2.x
  • +
  • 4016244 (controller) - controller: push data to influx
  • +
  • fcfce2e (controller) - workflow-manager: add workflow-manager support
  • +
  • 00e9bfb (controller) - influxdb: review influxdb code
  • +
  • dd644d5 (controller) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 118278b (controller) - charts: set the default chart version
  • +
  • 122a9cd (controller) - oauth2: add oauth2 support
  • +
  • 559a5b6 (controller) - controller: use cncf buildpacks replace slugrunner
  • +
  • 96130e6 (controller) - charts: database configuration optimization of passport and controller
  • +
  • 2ea8508 (controller) - oauth: using passport authentication
  • +
  • 868c437 (database) - database: multi-platform support
  • +
  • eadd5da (database) - build: add buildx support
  • +
  • b6eea4c (database) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 04a88db (database) - charts: set the default chart version
  • +
  • 92ed309 (database) - database: add initContainer
  • +
  • ee6b78f (fluentd) - build: add buildx support
  • +
  • f523e30 (fluentd) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • ee47b53 (fluentd) - charts: set the default chart version
  • +
  • 80a51af (influxdb) - influxdb: modify influxdb naming rules
  • +
  • fb10030 (influxdb) - influxdb: use influxdb v2
  • +
  • 0e87ad8 (influxdb) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 9d10801 (influxdb) - charts: set the default chart version
  • +
  • d825c9f (logger) - build: add buildx support
  • +
  • b139576 (logger) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 88f84ea (logger) - charts: set the default chart version
  • +
  • 5ccae3e (logger) - dockerfile: remove chmod cmd
  • +
  • 193aefc (logger) - logger: add initContainers
  • +
  • baee330 (minio) - minio: multi-platform support
  • +
  • ad5d055 (minio) - build: add buildx support
  • +
  • 19868d4 (minio) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 4bd84b8 (minio) - charts: set the default chart version
  • +
  • 79d1f2f (monitor) - database: multi-platform support
  • +
  • 88e5a7f (monitor) - build: add buildx support
  • +
  • 5672e99 (monitor) - influxdb: modify influxdb naming rules
  • +
  • 8672103 (monitor) - influxdb: use influxdb v2
  • +
  • 66cb4c8 (monitor) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 9576eb3 (monitor) - charts: set the default chart version
  • +
  • 30809c9 (monitor) - monitor: add initContainers
  • +
  • 70d140c (nsqd) - nsqd: using self compiled nsq binary
  • +
  • 1073d4f (nsqd) - nsqd: use GOPATH replace /go
  • +
  • e498480 (nsqd) - build: add buildx support
  • +
  • cf9b7d5 (nsqd) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • c335856 (nsqd) - charts: set the default chart version
  • +
  • efba713 (redis) - build: add buildx support
  • +
  • c7a3b53 (redis) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 4cdad7b (redis) - charts: set the default chart version
  • +
  • 652b443 (registry) - registry: multi-platform support
  • +
  • 4060176 (registry) - registry: use docker build
  • +
  • 7102a03 (registry) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 6c8600d (registry) - charts: set the default chart version
  • +
  • 33a51c9 (registry) - registry: add initContainers
  • +
  • bef70dc (registry-proxy) - build: add buildx support
  • +
  • d2319c1 (registry-proxy) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 02fafed (registry-proxy) - charts: set the default chart version
  • +
+

Fixes

+
    +
  • 5499c9a (controller) - gunicorn: gunicorn not running
  • +
  • 06e9e88 (controller) - controller: error loading shared library
  • +
  • 01b5bd0 (controller) - controller: upgrade celery config
  • +
  • 6e32d55 (controller) - controller: fix update resources bug
  • +
  • 0e0d53f (controller) - chart: set the domain depends certManagerEnabled
  • +
  • 2ac4ca8 (controller) - passport: error loading shared library libexpat.so.1
  • +
  • a0dd517 (fluentd) - fluentd: drone build
  • +
  • 6eca2a3 (logger) - logger: golang lint
  • +
  • 63b0aa0 (registry) - drone: charts url error
  • +
+

Docs

+
    +
  • 472cfcc (controller) - controller organize README.md document
  • +
  • d9d6e29 (redis) - redis: delete links that do not exist
  • +
+

Test case

+
    +
  • 1468f57 (controller) - controller: add command unittest
  • +
+

Maintenance

+
    +
  • 9999bfd (builder) - builder:replace the special words
  • +
  • cda8b58 (builder) - builder: remove docker keyword from charts
  • +
  • dc575dd (builder) - builder: use imagebuilder replace dockerbuilder
  • +
  • d3bb183 (builder) - docker: use the full name of registry
  • +
  • 5fe34d1 (builder) - travis: add DEV_REGISTRY
  • +
  • 7e36453 (builder) - CICD: use drone
  • +
  • 52b8d9d (builder) - drone: add image_registries volumes
  • +
  • 65963f4 (builder) - k8s: add privileged to dind
  • +
  • d345fcf (builder) - LICENSE: revert modifications to Apache license
  • +
  • 7975c99 (builder) - drone: always pull image
  • +
  • 59633dd (builder) - builder: modify launch imagebuild pod
  • +
  • 8d14e67 (builder) - builder: use Procfile in anywhere
  • +
  • 5357fa8 (builder) - go: bump go mod
  • +
  • 8d26ac0 (builder) - k8s: k8s deprecated api migration
  • +
  • 0af620d (builder) - chars: change org to imageTag
  • +
  • ae84303 (builder) - builder: run imagebuider replace pod with job
  • +
  • 3b2c496 (builder) - builder: change docs website
  • +
  • 5679a4c (builder) - builder: upgrade to golang1.17
  • +
  • a214503 (controller) - controller:replace whitelist with allowlist
  • +
  • 375ddcc (controller) - ps:drycc ps:list show autoscale num
  • +
  • c32e409 (controller) - ldap: canot register when ldap is enabled
  • +
  • c46580a (controller) - controller:modify redis config
  • +
  • fa9e87b (controller) - chart:modify controller charts
  • +
  • 6f9fd08 (controller) - nsq: remove nsq
  • +
  • 994b2dc (controller) - docker-buildx: add check-docker
  • +
  • a720c3a (controller) - controller: remove docker keyword from charts
  • +
  • e9a5c84 (controller) - docker: use the full name of registry
  • +
  • a26614a (controller) - controller: add rabbitmq env
  • +
  • 3df229d (controller) - controller: modify database config && remove redis port config && add env prefix with DRYCC
  • +
  • 257e94b (controller) - controller: CELERY_BROKER use rabbitmq and modify celery-deployment cronjob
  • +
  • f4d6ec3 (controller) - chart: pretty chart format
  • +
  • 63e6195 (controller) - influxdb: modify influxdb code
  • +
  • 0f6d408 (controller) - CICD: use drone
  • +
  • 87bad28 (controller) - python: upgrade to python3.9
  • +
  • e8f7560 (controller) - volumes: modify mount summary
  • +
  • 6cf6c6b (controller) - drone: add image_registries volumes
  • +
  • a9397e8 (controller) - oauth: modify token Authentication
  • +
  • c7f8c8b (controller) - deps: bump django from 2.2.14 to 2.2.18 in /rootfs
  • +
  • a1a08aa (controller) - deps: bump djangorestframework from 3.11.0 to 3.11.2 in /rootfs
  • +
  • efd78b4 (controller) - deps: bump django from 2.2.18 to 2.2.20 in /rootfs
  • +
  • 649b044 (controller) - deps: bump django from 2.2.20 to 2.2.22 in /rootfs
  • +
  • 41b742b (controller) - deps: bump django from 2.2.22 to 2.2.24 in /rootfs
  • +
  • 22ffe5d (controller) - LICENSE: revert modifications to Apache license
  • +
  • c98b468 (controller) - drone: always pull image
  • +
  • 20e6edb (controller) - chart: modify the problem of using buildpack
  • +
  • db16879 (controller) - controller: pretty pods list print
  • +
  • ba6f456 (controller) - test: pretty pods list print
  • +
  • 5fce4b7 (controller) - k8s: k8s deprecated api migration
  • +
  • e9e0bcb (controller) - oauth: using passport authentication
  • +
  • 0311172 (controller) - chars: change org to imageTag
  • +
  • 150eff1 (controller) - charts: update cert-manager api version
  • +
  • de8545a (controller) - controller: update requirements
  • +
  • 1442207 (controller) - controller: using django native JSONFiled
  • +
  • ab4e836 (controller) - oauth: modify passport api
  • +
  • 5c54e06 (controller) - controller: eliminate pip warnings
  • +
  • 870328d (controller) - controller: remove entrypoint
  • +
  • 5e5e6ae (controller) - controller: upgrade celery config
  • +
  • 607778f (controller) - controller: add initContainer
  • +
  • 23dc016 (controller) - chart: set the domain depends certManagerEnabled
  • +
  • f3cf20b (controller) - controller: remove default bash env
  • +
  • 73f2636 (controller) - controller: modify alpinelinux repositories
  • +
  • 498e9f2 (controller) - chart: change certManagerEnabled to boolean type
  • +
  • 27f5308 (controller) - passport: exclude cryptography
  • +
  • 370b75d (controller) - controller: use sh env
  • +
  • 07585b4 (database) - postgres:replace the special words
  • +
  • 20172dc (database) - database: remove docker keyword from charts
  • +
  • abb9b88 (database) - docker: use the full name of registry
  • +
  • e72f58f (database) - chart: modify the off-cluster database
  • +
  • a91f64f (database) - travis: add DEV_REGISTRY
  • +
  • 614fb76 (database) - tests: use add-host replace link
  • +
  • a3428f3 (database) - CICD: use drone
  • +
  • 239fef1 (database) - drone: add image_registries volumes
  • +
  • 42858e1 (database) - LICENSE: revert modifications to Apache license
  • +
  • d0fe850 (database) - drone: always pull image
  • +
  • 34a36ad (database) - charts: Nn secret is generated during off-cluster
  • +
  • 064ccf4 (database) - database: create database
  • +
  • 9228992 (database) - chars: change org to imageTag
  • +
  • 9f7810c (database) - database: upgrade to wal-g v1.1
  • +
  • 05783f4 (fluentd) - fluentd:replace the special words
  • +
  • 0739809 (fluentd) - influxdb:replace monitor-influx with influx
  • +
  • f02487c (fluentd) - fluentd: remove docker keyword from charts
  • +
  • 2c96cc0 (fluentd) - docker: use the full name of registry
  • +
  • b20c429 (fluentd) - charts: remove port config
  • +
  • 6dd0197 (fluentd) - travis: add DEV_REGISTRY
  • +
  • c5bec51 (fluentd) - CICD: use drone
  • +
  • f8524b7 (fluentd) - drone: add image_registries volumes
  • +
  • a50878a (fluentd) - LICENSE: revert modifications to Apache license
  • +
  • 14fe20e (fluentd) - drone: always pull image
  • +
  • 4a2f660 (fluentd) - k8s: k8s deprecated api migration
  • +
  • de2dd91 (fluentd) - chars: change org to imageTag
  • +
  • a9f1944 (fluentd) - fluentd: upgrade to fluentd1.14
  • +
  • 7cb4e95 (influxdb) - influxdb: change username to user
  • +
  • 0fdc21b (influxdb) - influxdb: remove docker keyword from charts
  • +
  • b2acddb (influxdb) - influxdb: change default path
  • +
  • ba88919 (influxdb) - influxdb: add check_env function
  • +
  • 9117401 (influxdb) - influxdb: modify init_influxdb has_bucket
  • +
  • 092a3e6 (influxdb) - chart: pod not readiness
  • +
  • 51de380 (influxdb) - travis: add DEV_REGISTRY
  • +
  • 66d7667 (influxdb) - docker: replace influxdb base image
  • +
  • 3aa3094 (influxdb) - CICD: use drone
  • +
  • 14b9c24 (influxdb) - drone: add image_registries volumes
  • +
  • 02b4cd1 (logger) - logger:replace the special words
  • +
  • 114b5d5 (logger) - reids: delete the logger prefix of redis
  • +
  • 639278a (logger) - redis: remove logger from redis conf
  • +
  • 90195e2 (logger) - go: remove GOOS and GOARCH
  • +
  • 31e2e27 (logger) - logger: remove docker keyword from charts
  • +
  • 8fbd9fa (logger) - docker: use the full name of registry
  • +
  • b39df2d (logger) - charts: remove redis\nsqd port config
  • +
  • 35d6d07 (logger) - travis: add DEV_REGISTRY
  • +
  • 69aabf5 (logger) - tests: remove docker link
  • +
  • e916644 (logger) - CICD: use drone
  • +
  • d6872b7 (logger) - drone: add image_registries volumes
  • +
  • 37801da (logger) - LICENSE: revert modifications to Apache license
  • +
  • cfb4b38 (logger) - drone: always pull image
  • +
  • 8bda3bf (logger) - go: bump go mod
  • +
  • e13ebfc (logger) - chars: change org to imageTag
  • +
  • 38e6d8d (minio) - minio:replace the special words
  • +
  • d6925dd (minio) - minio: remove docker keyword from charts
  • +
  • d56bc39 (minio) - docker: use the full name of registry
  • +
  • e4696cc (minio) - travis: add DEV_REGISTRY
  • +
  • 70c5c79 (minio) - minio: use latest version
  • +
  • 773cf6c (minio) - Makefile: remove DEV_REGISTRY ?=
  • +
  • 5ce5bc6 (minio) - CICD: use drone
  • +
  • 5da8be3 (minio) - drone: add image_registries volumes
  • +
  • c1f0611 (minio) - LICENSE: revert modifications to Apache license
  • +
  • b73f792 (minio) - drone: always pull image
  • +
  • 79d1c93 (minio) - go: bump go mod
  • +
  • c448899 (minio) - chars: change org to imageTag
  • +
  • 15ee49e (minio) - minio: migrate deprecated warning
  • +
  • 9968a1a (minio) - minio: upgrade to golang1.7
  • +
  • 14fedd2 (monitor) - monitor:replace the special works
  • +
  • 52c431a (monitor) - reids: delete the logger prefix of redis
  • +
  • 2c95b47 (monitor) - redis: remove logger from redis conf
  • +
  • da9bc56 (monitor) - monitor:remove influxdb
  • +
  • 53f47b9 (monitor) - grafana: use grafana docker image
  • +
  • 5bdb188 (monitor) - grafana: use grafana docker image
  • +
  • c0586dd (monitor) - monitor: remove docker keyword from charts
  • +
  • 87d02b6 (monitor) - charts: add nodes and persistentvolumes rule
  • +
  • 1b5598f (monitor) - monitor: modify grafana dashboard with FLUX and pretty config.toml
  • +
  • bcbc0d5 (monitor) - docker: use the full name of registry
  • +
  • 9418c9e (monitor) - monitor: fix upload dashboard error and modify INFLUXDB input
  • +
  • 589f29a (monitor) - travis: add DEV_REGISTRY
  • +
  • f776f8a (monitor) - CICD: use drone
  • +
  • 6ca3060 (monitor) - drone: add image_registries volumes
  • +
  • 6a9ffb2 (monitor) - LICENSE: revert modifications to Apache license
  • +
  • 45e41ed (monitor) - drone: always pull image
  • +
  • 654d407 (monitor) - k8s: k8s deprecated api migration
  • +
  • 41e9b9c (monitor) - chars: change org to imageTag
  • +
  • 99c10d3 (monitor) - charts: update cert-manager api version
  • +
  • 9bf83c4 (monitor) - oauth: user oauth passport
  • +
  • a128f6d (monitor) - chart: change certManagerEnabled to boolean type
  • +
  • 8f897fe (monitor) - chart: set the domain depends certManagerEnabled
  • +
  • ba6d793 (nsqd) - README:update travis build status
  • +
  • 49879c4 (nsqd) - nsqd: minimum git clone code
  • +
  • c5e2680 (nsqd) - nsqd: remove docker keyword from charts
  • +
  • 21dd17b (nsqd) - docker: use the full name of registry
  • +
  • 7d86b3c (nsqd) - charts: remove port config
  • +
  • c073d95 (nsqd) - travis: add DEV_REGISTRY
  • +
  • 55c297c (nsqd) - CICD: use drone
  • +
  • 165c2ae (nsqd) - drone: add image_registries volumes
  • +
  • 9c6a1f8 (nsqd) - LICENSE: revert modifications to Apache license
  • +
  • 9283098 (nsqd) - drone: always pull image
  • +
  • 46acf8a (nsqd) - k8s: k8s deprecated api migration
  • +
  • 43caf80 (nsqd) - chars: change org to imageTag
  • +
  • 6897471 (nsqd) - nsqd: use official image
  • +
  • 297bc05 (redis) - redis:replace the special words
  • +
  • f5f8b5e (redis) - reids: delete the logger prefix of redis
  • +
  • af7b657 (redis) - redis: change logger-redis to redis
  • +
  • 8dca154 (redis) - redis: remove logger from redis conf
  • +
  • eaeda2d (redis) - redis: remove docker keyword from charts
  • +
  • 53c6358 (redis) - docker: use the full name of registry
  • +
  • ae37416 (redis) - charts: remove port config
  • +
  • e985656 (redis) - travis: add DEV_REGISTRY
  • +
  • 423336a (redis) - CICD: use drone
  • +
  • be64ab4 (redis) - drone: add image_registries volumes
  • +
  • 3bec735 (redis) - LICENSE: revert modifications to Apache license
  • +
  • 4f934f6 (redis) - drone: always pull image
  • +
  • 359b878 (redis) - chars: change org to imageTag
  • +
  • 83b8ac2 (registry) - workflow:replace the special words
  • +
  • 869b280 (registry) - registry: remove docker keyword from charts
  • +
  • 999c1e9 (registry) - docker: use the full name of registry
  • +
  • 5652da9 (registry) - travis: add DEV_REGISTRY
  • +
  • cc8c6c2 (registry) - CICD: use drone
  • +
  • c7bdbd0 (registry) - CICD: pretty .drone.yaml format
  • +
  • 5c55a38 (registry) - test: use add-host replace link
  • +
  • f8866f3 (registry) - drone: add image_registries volumes
  • +
  • 6c8292f (registry) - LICENSE: revert modifications to Apache license
  • +
  • 1d50f2c (registry) - drone: always pull image
  • +
  • efbca6d (registry) - chars: change org to imageTag
  • +
  • 2eafc59 (registry-proxy) - registry-proxy: update nginx
  • +
  • 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions
  • +
  • c72db96 (registry-proxy) - registry-proxy: change travis icon url
  • +
  • 63ffb92 (registry-proxy) - registry-proxy:replace the special works
  • +
  • 1d904a6 (registry-proxy) - registry-proxy: remove docker keyword from charts
  • +
  • c8200b1 (registry-proxy) - docker: use the full name of registry
  • +
  • d3fa939 (registry-proxy) - travis: add DEV_REGISTRY
  • +
  • 5a8b353 (registry-proxy) - CICD: use drone
  • +
  • 703d05a (registry-proxy) - drone: add image_registries volumes
  • +
  • aa71db1 (registry-proxy) - LICENSE: revert modifications to Apache license
  • +
  • 710c126 (registry-proxy) - drone: always pull image
  • +
  • 2dcc5e6 (registry-proxy) - chars: change org to imageTag
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.4.0

+
New Drycc Workflow Release v1.4.0
+ +

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.

+

Workflow ## v1.3.0 -> v1.4.0

+

Releases

+
    +
  • builder v1.1.0 -> v1.2.0
  • +
  • slugbuilder v1.1.1 -> v1.2.0
  • +
  • dockerbuilder v1.1.1 -> v1.1.2
  • +
  • controller v1.2.1 -> v1.3.0
  • +
  • slugrunner v1.1.1 -> v1.1.2
  • +
  • database v1.0.1 -> v1.0.2
  • +
  • fluentd v1.0.1 -> v1.1.0
  • +
  • redis v1.0.0 -> v1.1.0
  • +
  • logger v1.0.0 -> v1.1.0
  • +
  • minio v1.0.1 -> v1.1.0
  • +
  • monitor v1.0.1 -> v1.1.0
  • +
  • nsqd v1.0.0 -> v1.1.0
  • +
  • registry v1.0.2 -> v1.0.3
  • +
  • registry-proxy v1.0.0 -> v1.0.1
  • +
+

Features

+
    +
  • fc7d93f (builder) - builder: use go-dev
  • +
  • 0c2159e (builder) - builder: fmt code and add create_bucket script
  • +
  • 1b88340 (controller) - controller: remove deprecated api
  • +
  • a92fdeb (controller) - routable: ingress support routable
  • +
  • 1e3eab3 (controller) - maintenance: add maintenance support for ingress
  • +
  • 56b9dd0 (controller) - crt: support containerd-ctr
  • +
  • 5fc3b46 (controller) - controller: add ephemeral-storage restriction
  • +
  • d677e52 (controller) - controller: add a volume command
  • +
  • 5f1323a (controller) - controller:drycc run cmd add –mount para
  • +
  • 74c36a5 (controller) - tasks: add distributed async task
  • +
  • 139c3ca (controller) - tasks: change nsq reader to async
  • +
  • f237d74 (controller) - controller:add drycc resource cmd
  • +
  • 41b46d0 (controller) - controller:add drycc resource cmd improvement
  • +
  • c26f7d8 (controller) - controller: add LimitRanges support
  • +
  • 45b5d1b (controller) - users: add users status api
  • +
  • 4e16f9b (controller) - ps:add ps:stop/start command
  • +
  • c659fa9 (controller) - k8s: add k8s cluster domain
  • +
  • 31a625d (controller) - ps:add ps:stop/start command
  • +
  • 00a779a (fluentd) - fluentd: support containerd log format
  • +
  • f3f1bd4 (fluentd) - nsqd: add stateless nsqd cluster support
  • +
  • db7147c (fluentd) - mirrors: delete aliyun mirrors
  • +
  • 689c12e (logger) - nsqd: add stateless nsqd cluster support
  • +
  • 78ccc5d (logger) - redis: add redis client cluster support
  • +
  • 9843f2c (logger) - k8s: add k8s cluster domain
  • +
  • 6ba122e (minio) - minio: add pvc support
  • +
  • 6973550 (monitor) - monitor: add ingress for monitor
  • +
  • cd73305 (monitor) - charts: add volumeName support
  • +
  • 4769fe9 (monitor) - nsqd: add stateless nsqd cluster support
  • +
  • 87806df (monitor) - k8s: add k8s cluster domain
  • +
  • 4db40c4 (nsqd) - nsqd: add stateless nsqd cluster support
  • +
  • b6f3d4f (nsqd) - nsqd: add stateless nsqd cluster support
  • +
  • 74b85bb (redis) - redis: change redis to statefulset
  • +
  • ff98b50 (slugbuilder) - slugbuilder: delete build hook
  • +
  • b201c2f (slugbuilder) - buildpacks: use drycc buildpacks
  • +
+

Fixes

+
    +
  • 0ec042d (builder) - test: fix test case error
  • +
  • 4fb113b (builder) - build: base image replace by alpine
  • +
  • 443df48 (builder) - minio: fix not bucket error
  • +
  • 3dab5b0 (builder) - minio: create bucket error
  • +
  • 734fca6 (controller) - autoscale: Fix for autoscale on k8s-1.9+ without breaking manual scaling
  • +
  • a7dcd10 (controller) - controller: test pass
  • +
  • 93f0f2e (controller) - controller: fix migrations error
  • +
  • 4724375 (controller) - controller: fix test error
  • +
  • 7bacf29 (controller) - charts: fix clusterrole
  • +
  • 90957f7 (controller) - pod: sort events error
  • +
  • 440b13e (controller) - controller: review table structure
  • +
  • 0a470a6 (controller) - controller: bump tornado 5.1.1
  • +
  • e39218b (controller) - pynsq: no current event loop in thread
  • +
  • 1d8630e (controller) - tests: fix test_task.py run error
  • +
  • 1ff1202 (controller) - controller: fix test case
  • +
  • d8c0da3 (controller) - settings: fix env name
  • +
  • 6d8fd36 (database) - 003_restore_from_backup.sh: ignore script exit 1
  • +
  • e0394a9 (database) - minio: fix not bucket error
  • +
  • f35f252 (database) - mc: fix create_bucket error
  • +
  • 74d6886 (database) - postgres: recovery mode not run
  • +
  • e50d0c1 (dockerbuilder) - caddy: fix caddy not start
  • +
  • f3bec7a (fluentd) - influxdb: fix influxdb host and port
  • +
  • bc19f27 (fluentd) - charts: skipped value for daemon_environment: Not a table
  • +
  • 338d623 (logger) - logger: logger not run in alpine
  • +
  • 7788302 (minio) - minio: bump minio version
  • +
  • 619eed0 (minio) - fix: use go mod replace dep
  • +
  • 3b42122 (monitor) - monitor: fix host error
  • +
  • 67998ef (monitor) - influxdb: replace drycc-monitor-influxapi to drycc-monitor-influx-api
  • +
  • 2cc361c (registry) - registry: fix test case
  • +
  • 548297a (registry) - minio: fix not bucket error
  • +
  • 5412ddb (registry) - minio: create bucket error
  • +
  • d0d629e (slugbuilder) - slugbuilder:fix normalize_storage path
  • +
  • d76ecbe (slugbuilder) - slugbuilder: use v3 api
  • +
  • c505e18 (slugbuilder) - shellcheck: SC2039
  • +
+

Style

+
    +
  • c893a17 (builder) - builder: fmt code
  • +
  • bba5795 (controller) - controller: format code
  • +
  • d36082b (controller) - controller: fix pep8
  • +
  • 66026f2 (controller) - resource: standardize the naming of resource
  • +
  • 03d7e2c (controller) - servicecatalog: change servicecatalog to svcat
  • +
  • 49dbb6d (controller) - controller: flake8 upgrade
  • +
  • cbfc108 (monitor) - monitor: format charts and dashboard
  • +
  • ee85954 (slugbuilder) - slugbuilder: use shellcheck
  • +
  • 3afed2e (slugbuilder) - docker: simplify dockerfile
  • +
  • 36b7f68 (slugrunner) - docker: simplify dockerfile
  • +
+

Maintenance

+
    +
  • 61bb0ef (builder) - aws: upgrade aws sdk version
  • +
  • 0f2e074 (builder) - chore: use go mode replace dep
  • +
  • e9a2219 (builder) - builder: delete glide up
  • +
  • bb8c518 (builder) - registry: del quay.io
  • +
  • fa6d02f (builder) - builder: upgrade go.sum
  • +
  • 9d61e8d (builder) - build: upgrade go.mod
  • +
  • d763a98 (builder) - charts: upgrade k8s newer API versions
  • +
  • d1bc1aa (builder) - pkg: upgrade to new drycc/pkg
  • +
  • 02b1e98 (builder) - builder: update go mod
  • +
  • 8e17d65 (builder) - builder: change alpine repositories
  • +
  • f32b723 (builder) - mirrors: delete aliyun mirrors
  • +
  • e33dc61 (builder) - minio: use bin mc replace docker images
  • +
  • 3ab4f1c (builder) - builder: update controller-sdk-go
  • +
  • b2adfac (builder) - heroku: remove heroku-16 support
  • +
  • f429ac8 (builder) - builder: set GIT_LOCK_TIMEOUT to 30 minutes
  • +
  • 7197c83 (builder) - go.mod:upgrade require pkg controller-sdk-go
  • +
  • 5f3e22d (controller) - deps: bump django from 1.11.21 to 1.11.22 in /rootfs
  • +
  • 1db645a (controller) - deps: bump django from 1.11.22 to 1.11.23 in /rootfs
  • +
  • fbe8067 (controller) - deps: bump django from 1.11.23 to 1.11.29 in /rootfs
  • +
  • 537d667 (controller) - registry: del quay.io
  • +
  • a23c65b (controller) - deps: update all deps to the latest version
  • +
  • 546337e (controller) - charts: upgrade k8s newer API versions
  • +
  • 06023f8 (controller) - workflow-manager: del workflow-manager
  • +
  • bba5736 (controller) - controller: change cluster-issuer location
  • +
  • 6c43661 (controller) - Certificatechange cluster-issuer location
  • +
  • 39a4728 (controller) - controller:change cluster-issuer location del controller-cluster-issuer.yaml
  • +
  • 9e96d3f (controller) - Certificate:upgrade version cert-manager.io/v1alpha2
  • +
  • 8e68049 (controller) - docker: use INDEX_URL replace index.docker.io
  • +
  • 8fda205 (controller) - cert_manager: change cert_manager_enabled to global
  • +
  • 6fefb6d (controller) - charts: change platform_domain to global
  • +
  • 064b2ad (controller) - maintenance: remove maintenance support
  • +
  • b8797c9 (controller) - workflow: remove namespace
  • +
  • 1b20d76 (controller) - quota: add kube quota config
  • +
  • d780075 (controller) - pod: add pod default resources support
  • +
  • 3d72c08 (controller) - rename: rename ingress name
  • +
  • 0aa6ab9 (controller) - mirrors: delete aliyun mirrors
  • +
  • 7533a65 (controller) - heroku: remove heroku-16 support
  • +
  • e5a885d (controller) - controller:check mount volume path
  • +
  • 9014e74 (controller) - test: optimization Dockerfile.test
  • +
  • 0b6ebb2 (controller) - tasks: change apply_async parameters
  • +
  • 835f009 (controller) - wsgi: add tornado 6 support
  • +
  • 67a4ad7 (controller) - utils: use threads replace asyncio
  • +
  • a28949b (controller) - ldap: add AUTH_LDAP_USER_FLAGS_BY_GROUP
  • +
  • a903209 (controller) - charts: add custom controller environment variables support
  • +
  • e0e783e (controller) - ldap: change filter style
  • +
  • d760825 (controller) - scheduler: remove debug log
  • +
  • a25928e (controller) - wsgi: remove a wsgi.py file
  • +
  • 7b2696e (controller) - log: disable nsq.client info log
  • +
  • 8d5c07b (controller) - charts: add default environment
  • +
  • 025f4a2 (controller) - controller: change quota name
  • +
  • ebda60e (controller) - controller: review pvc code
  • +
  • 8832ba9 (controller) - controller: change status\binding model type and mount path check container_types
  • +
  • 7148d04 (controller) - controller: add overcommit cpu and ram support
  • +
  • 4d2087c (controller) - limits: modify limits unit verification
  • +
  • af36970 (controller) - api: check cpu/memory range for api
  • +
  • 329355b (controller) - volumes: modify the volume size
  • +
  • 9dfee09 (controller) - LimitRanges: modify the default limits
  • +
  • 5205bca (controller) - controller: improve the details of certificate
  • +
  • 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • 6415e2c (database) - postgres: upgrade to pg13
  • +
  • 12e6806 (database) - charts: upgrade k8s newer API versions
  • +
  • d294509 (database) - minio: use canary minio test
  • +
  • 1bad02e (database) - mirrors: delete aliyun mirrors
  • +
  • d51420b (database) - minio: use bin mc replace docker images
  • +
  • 4133d05 (dockerbuilder) - dockerbuilder: update caddy and kaniko
  • +
  • 6b4dd18 (dockerbuilder) - minio: use bin mc replace docker images
  • +
  • 6df9b7c (fluentd) - deps-dev: update rake requirement from ~> 10.0 to ~> 12.3
  • +
  • c2490f8 (fluentd) - fluentd: upgrade fluentd
  • +
  • be4a56a (fluentd) - fluentd: add Gemfile.lock
  • +
  • 2237f75 (fluentd) - charts: upgrade k8s newer API versions
  • +
  • c574065 (fluentd) - charts: upgrade k8s newer API versions
  • +
  • 52b8084 (fluentd) - router: delete obsolete router code
  • +
  • 3b3cceb (fluentd) - fluentd: remove manifests dir
  • +
  • 25c6702 (fluentd) - nsqd: change var name
  • +
  • bd571be (fluentd) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS
  • +
  • 72aa4e6 (fluentd) - influxdb: change influxdb service name
  • +
  • bd61903 (logger) - logger: use go mod replace dep
  • +
  • 69c63a1 (logger) - logger: update go.mod
  • +
  • 3aa9cd7 (logger) - registry: del quay.io
  • +
  • f058496 (logger) - nsqd: change var name
  • +
  • 6d9787c (logger) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS
  • +
  • 85ed307 (logger) - logger: standard naming
  • +
  • d88e7b6 (minio) - minio: update minio api to v7
  • +
  • 43715d2 (minio) - minio: upgrade minio
  • +
  • 0e1239b (minio) - minio: use docker.io replace quay.io
  • +
  • f7f047b (minio) - registry: del quay.io
  • +
  • afa7128 (minio) - build: upgrade go.mod
  • +
  • aff2db5 (minio) - charts: upgrade k8s newer API versions
  • +
  • 4547f14 (minio) - pkg: upgrade to new drycc/pkg
  • +
  • 2769b85 (minio) - minio: use bin mc replace docker images
  • +
  • 35dde8d (monitor) - monitor: update grafana influxdb telegraf
  • +
  • 9e3a949 (monitor) - charts: upgrade k8s newer API versions
  • +
  • 6af0432 (monitor) - workflow-manager: remove workflow-manager
  • +
  • 0611c07 (monitor) - router: delete obsolete router code
  • +
  • be04824 (monitor) - cert_manager: change cert_manager_enabled to global
  • +
  • 3780165 (monitor) - charts: change platform_domain to global
  • +
  • 50b04e1 (monitor) - influxdb: remove influxdb admin ui
  • +
  • 6ab4d68 (monitor) - influxdb: remove unuse port
  • +
  • f1510bd (monitor) - monitor: update grafana dashboard,telegraf inputs.kubernetes
  • +
  • f36de2c (monitor) - pvc: upgrade to new format
  • +
  • fc78a0a (monitor) - workflow: remove namespace
  • +
  • e85890f (monitor) - monitor: monitoring nsqd and redis separately
  • +
  • 694f6b1 (monitor) - mirrors: delete aliyun mirrors
  • +
  • 4aea36a (monitor) - grafana: add ldap support for grafana
  • +
  • 68fc30f (nsqd) - nsq: update nsq
  • +
  • 16f32aa (nsqd) - charts: upgrade k8s newer API versions
  • +
  • 04db389 (redis) - reids: update to redis 6
  • +
  • 3f01bab (redis) - charts: upgrade k8s newer API versions
  • +
  • 647e4be (registry) - registry: del quay.io
  • +
  • 0bbce99 (registry) - charts: upgrade k8s newer API versions
  • +
  • a982b50 (registry) - minio: use bin mc replace docker images
  • +
  • e088da3 (registry-proxy) - ingress: renmae use_native_ingress to use_ingress
  • +
  • 7e88337 (registry-proxy) - nginx: upgrade nginx to mainline
  • +
  • 7204d72 (registry-proxy) - registry: optimizing variable naming
  • +
  • 2eafc59 (registry-proxy) - registry-proxy: update nginx
  • +
  • 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions
  • +
  • c72db96 (registry-proxy) - registry-proxy: change travis icon url
  • +
  • ca9f962 (slugbuilder) - slugbuilder: del BUILDPACK_URL support
  • +
  • 1b74dd5 (slugbuilder) - slugbuilder: add heroku-20 support
  • +
  • 54d4ad2 (slugbuilder) - slugbuilder: del quay.io
  • +
  • a78f37e (slugbuilder) - slugbuilder: add heroku-20 stack
  • +
  • 94ac94a (slugbuilder) - minio: use bin mc replace docker images
  • +
  • 53b4b8b (slugbuilder) - slugbuilder: modify stack priority
  • +
  • 58e2bd2 (slugbuilder) - dockerfile: add WORKDIR /tmp
  • +
  • b29cd04 (slugbuilder) - slugbuilder: add pre_build.sh
  • +
  • 9d319f6 (slugbuilder) - slugbuilder: silent mc command output
  • +
  • d1ec3c9 (slugbuilder) - heroku: remove heroku-16 support
  • +
  • 5048534 (slugbuilder) - slugbuilder: use drycc stack-images
  • +
  • a116537 (slugrunner) - slugrunner: add heroku-20 support
  • +
  • a1196bf (slugrunner) - slugrunner: del quay.io
  • +
  • 64c96d7 (slugrunner) - slugrunner: add heroku-20 stack
  • +
  • cc3e226 (slugrunner) - minio: use bin mc replace docker images
  • +
  • 9130bde (slugrunner) - shellcheck: shellcheck installer
  • +
  • 4ea33e1 (slugrunner) - slugrunner: modify stack priority
  • +
  • 5514e8b (slugrunner) - heroku: remove heroku-16 support
  • +
  • be829fb (slugrunner) - slugrunner: use drycc stack-images
  • +
  • e1e06be (slugrunner) - slugrunner: remove Dockerfile.heroku-16
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.3.0

+
New Drycc Workflow Release v1.3.0
+ +

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.

+

Workflow ## v1.2.0 -> v1.3.0

+

Releases

+
    +
  • builder v1.0.2 -> v1.1.0
  • +
  • slugbuilder v1.1.0 -> v1.1.1
  • +
  • dockerbuilder v1.1.0 -> v1.1.1
  • +
  • controller v1.2.0 -> v1.2.1
  • +
  • slugrunner v1.1.0 -> v1.1.1
  • +
  • database v1.0.0 -> v1.0.1
  • +
  • fluentd v1.0.0 -> v1.0.1
  • +
  • minio v1.0.0 -> v1.0.1
  • +
  • monitor v1.0.0 -> v1.0.1
  • +
  • registry v1.0.1 -> v1.0.2
  • +
  • workflow-manager v1.0.0 -> v1.0.1
  • +
+

Features

+
    +
  • 9c7cceb (builder) - builder: add app config to env
  • +
+

Fixes

+
    +
  • 7fe44fa (controller) - docker: docker timeout must be an int, float or None
  • +
  • b196550 (controller) - controller: revert release.check_image_access for now
  • +
  • cc3ec13 (workflow-manager) - glide: bump goautoneg
  • +
+

Maintenance

+
    +
  • ef932c4 (builder) - controller-sdk-go: upgrade controller-sdk-go
  • +
  • 4654cf6 (controller) - django-rest-framework: upgrade to 3.9.3
  • +
  • 14121f1 (controller) - deps: bump djangorestframework from 3.9.3 to 3.9.4 in /rootfs
  • +
  • 385acdc (controller) - deps: bump django from 1.11.20 to 1.11.21 in /rootfs
  • +
  • fa312bb (database) - postgres: set max_connections = 1024
  • +
  • 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • b8878f6 (dockerbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • b097451 (fluentd) - fluent: upgrade fluent to v1.4
  • +
  • 4341f9a (minio) - mc: upgrade mc and minio
  • +
  • c1ee2a4 (monitor) - monitor: remove copyrights.tar.gz
  • +
  • 9854260 (registry) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • acc5627 (slugbuilder) - slugbuilder: internal support for multi buildpack
  • +
  • d58907e (slugbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • b39a0c2 (slugrunner) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
+ +
+ + + + + + + + + + + + + + + + +
+

Drycc Workflow v1.2.0

+
New Drycc Workflow Release v1.2.0
+ +

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.

+

Workflow ## v1.1.0 -> v1.2.0

+

Releases

+
    +
  • builder v1.0.1 -> v1.0.2
  • +
  • slugbuilder v1.0.0 -> v1.1.0
  • +
  • dockerbuilder v1.0.0 -> v1.1.0
  • +
  • controller v1.1.0 -> v1.2.0
  • +
  • slugrunner v1.0.0 -> v1.1.0
  • +
  • registry v1.0.0 -> v1.0.1
  • +
  • registry-proxy v1.0.1 -> v1.0.2
  • +
+

Features

+
    +
  • e5584e3 (controller) - controller: add STACK support
  • +
  • ad34dc1 (dockerbuilder) - kaniko: use kaniko replace docker-py
  • +
  • b81430e (dockerbuilder) - dockerbuilder: change image to image.json format
  • +
  • 60dde96 (slugbuilder) - slugbuilder: add STACK support
  • +
  • fe8b6e5 (slugrunner) - slugrunner: add STACK support
  • +
+

Maintenance

+
    +
  • 942f050 (builder) - registry: remove env DRYCC_REGISTRY_PROXY_PORT
  • +
  • ff7a16f (builder) - registry: remove ecr and gcr registry
  • +
  • ad13683 (builder) - builder: change DRYCC_BUILD_TYPE to DRYCC_STACK
  • +
  • 6def637 (builder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY
  • +
  • 5044e22 (builder) - registry: remove registry_secret_prefix
  • +
  • 2ea39cc (builder) - controller-go-sdk: upgrade controller-go-sdk
  • +
  • 6aee0d7 (builder) - registry: optimizing variable naming
  • +
  • f9c62d9 (controller) - domain: added reserved domain check
  • +
  • f5a135b (controller) - migrations: clean old migrations
  • +
  • 4369b2c (controller) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY
  • +
  • 1057ca5 (controller) - registry: remove registry_secret_prefix
  • +
  • d114b3e (controller) - docker: update docker client
  • +
  • edbe963 (dockerbuilder) - dockerfile: change base image to alpine
  • +
  • fb35baf (dockerbuilder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY
  • +
  • 946dbf6 (dockerbuilder) - docker: remove insecure support
  • +
  • 628d853 (dockerbuilder) - proxy: add registry proxy
  • +
  • ff27cbd (registry) - env: remove unused env
  • +
  • 7204d72 (registry-proxy) - registry: optimizing variable naming
  • +
+ +
+ + + + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/blog/releases/index.html b/blog/releases/index.html new file mode 100644 index 000000000..cdf7a4a0f --- /dev/null +++ b/blog/releases/index.html @@ -0,0 +1,445 @@ + + + + + + + + + + + + + + + + + + + + + +Release | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+
Posts in 2024
+
    +
  • +
    +
    Drycc Workflow v1.7.8
    +

    01.05.2024 in Release

    + + + + + + +

    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 …

    +

    Read more

    +
    +
  • +
  • +
    +
    Drycc Workflow v1.7.7
    +

    30.04.2024 in Release

    + + + + + + +

    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 …

    +

    Read more

    +
    +
  • +
  • +
    +
    Drycc Workflow v1.7.6
    +

    27.02.2024 in Release

    + + + + + + +

    Workflow ## v1.7.5 -> v1.7.6 Releases storage v0.0.4 -> v0.0.5 Maintenance 6cb63b6 (storage) - seaweedfs: bump version 3.63

    +

    Read more

    +
    +
  • +
  • +
    +
    Drycc Workflow v1.7.5
    +

    27.02.2024 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
  • +
    +
    Drycc Workflow v1.7.2
    +

    29.01.2024 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
+
Posts in 2023
+
    +
  • +
    +
    Drycc Workflow v1.7.0
    +

    08.12.2023 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
+
Posts in 2022
+
    +
  • +
    +
    Drycc Workflow v1.6.0
    +

    21.10.2022 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
  • +
    +
    Drycc Workflow v1.5.0
    +

    06.10.2022 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
+
Posts in 2021
+
    +
  • +
    +
    Drycc Workflow v1.4.0
    +

    06.10.2021 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
+
Posts in 2020
+
    +
  • +
    +
    Drycc Workflow v1.3.0
    +

    06.10.2020 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
+ +
+
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/blog/releases/index.xml b/blog/releases/index.xml new file mode 100644 index 000000000..dba538ceb --- /dev/null +++ b/blog/releases/index.xml @@ -0,0 +1,1803 @@ + + + Drycc – Release + /blog/releases/ + Recent content in Release on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Blog: Drycc Workflow v1.7.8 + /blog/2024/05/01/drycc-workflow-v1.7.8/ + Wed, 01 May 2024 00:00:00 +0000 + + /blog/2024/05/01/drycc-workflow-v1.7.8/ + + + + <h2 id="workflow--v177---v178">Workflow ## v1.7.7 -&gt; v1.7.8<a class="td-heading-self-link" href="#workflow--v177---v178" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.6.0 -&gt; v1.7.0</li> +<li>controller v1.8.0 -&gt; v1.9.0</li> +<li>workflow-cli v1.6.0 -&gt; v1.7.0</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/384c7ee9c69201b4d3280bb1582e50ad40210b8f"><code>384c7ee</code></a> (builder) - domain: add procfile_type</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/26c8c7f1a2ed3445fc4a52a5f7b8e7cace8a12e8"><code>26c8c7f</code></a> (controller) - domain: add procfile_type</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/bd49789b2aa8bbb8da440d63c83e339fd69d4774"><code>bd49789</code></a> (workflow-cli) - domain: add procfile_type</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.7 + /blog/2024/04/30/drycc-workflow-v1.7.7/ + Tue, 30 Apr 2024 00:00:00 +0000 + + /blog/2024/04/30/drycc-workflow-v1.7.7/ + + + + <h2 id="workflow--v176---v177">Workflow ## v1.7.6 -&gt; v1.7.7<a class="td-heading-self-link" href="#workflow--v176---v177" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.5.1 -&gt; v1.6.0</li> +<li>controller v1.7.0 -&gt; v1.8.0</li> +<li>database v1.2.1 -&gt; v1.3.0</li> +<li>passport v1.2.0 -&gt; v1.3.0</li> +<li>imagebuilder v1.1.1 -&gt; v1.2.0</li> +<li>fluentbit v0.0.1 -&gt; v0.0.2</li> +<li>logger v1.3.3 -&gt; v1.3.4</li> +<li>storage v0.0.5 -&gt; v0.1.0</li> +<li>gateway v0.0.2 -&gt; v0.0.3</li> +<li>monitor v1.4.0 -&gt; v1.4.1</li> +<li>redis v1.3.2 -&gt; v1.4.0</li> +<li>timeseries v0.0.2 -&gt; v0.1.0</li> +<li>prometheus v0.1.1 -&gt; v0.1.2</li> +<li>rabbitmq v1.2.1 -&gt; v1.3.0</li> +<li>registry v1.2.2 -&gt; v1.3.0</li> +<li>registry-proxy v1.2.1 -&gt; v1.2.2</li> +<li>workflow-cli v1.5.2 -&gt; v1.6.0</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/6c1cf5e514543737c38384596abffca1ac96af44"><code>6c1cf5e</code></a> (builder) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/65ae63c4d3aaff3354d162718ff07c0509b4e689"><code>65ae63c</code></a> (builder) - pipeline: add dryccfile support</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/bb7b11de75226c3a1cb9254dfec78a8edda0c864"><code>bb7b11d</code></a> (builder) - auth: add tokens api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/39d022fe0a4106c91ea461f73728490560f8d653"><code>39d022f</code></a> (controller) - ps: add pod logs support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/86056d06d8992172fe02240d7963aa416ec9c754"><code>86056d0</code></a> (controller) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4cf005c1cc4b361af80ef96597e291ebe3baec24"><code>4cf005c</code></a> (controller) - limits: add limits plan support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bf60e4bdbebb3f3288e0fbd81566c264dd187faf"><code>bf60e4b</code></a> (controller) - controller: add init job</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/98f77a8ceeea6e8a098cd37d79115201c40133e1"><code>98f77a8</code></a> (controller) - pipeline: add dryccfile support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8ce9a83f4bcf46d6039910e052e6ebfa959fd0e8"><code>8ce9a83</code></a> (controller) - cert-manager: add tls events</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7034f5d8347f0c85b40651eaf239a554fd95ae76"><code>7034f5d</code></a> (controller) - config: deploy according to procfile_type</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5554d8f9f26790783d97d6d6128920ffa9b28713"><code>5554d8f</code></a> (controller) - config: add typed_values</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2c5bbad2d74b1c40c61158477aac9103dac2eff4"><code>2c5bbad</code></a> (controller) - auth: add token api</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/410d34e8e639c973557104c3aee14a85324f3c0f"><code>410d34e</code></a> (database) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/693e4d199b18342e33c7ec68c3a651d29b7d9ad6"><code>693e4d1</code></a> (imagebuilder) - pipeline: add dryccfile support</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/7d9cc0679eac7dd873d8db8f9607e347830b2aa1"><code>7d9cc06</code></a> (imagebuilder) - config: add typed values</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/854e1711180de70bc83d3c65721910df013ef988"><code>854e171</code></a> (passport) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/7ac92557670d915c1e568c7297c5ec1b9620f1a1"><code>7ac9255</code></a> (passport) - oauth2: add authorization code for any grant type</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/4517547e21983dd7192ae8cc985c974ed2c64b51"><code>4517547</code></a> (rabbitmq) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/bccfcb43cd63e62974b55523a75fa994ed560453"><code>bccfcb4</code></a> (redis) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/d8876055c0732c470d17d9205a5188289fdac1ec"><code>d887605</code></a> (registry) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/ff09e5b8279cd3343370bfa58c3acba234621263"><code>ff09e5b</code></a> (storage) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/c6e2ac82c8adc75687dbc814cb2163b06820311e"><code>c6e2ac8</code></a> (timeseries) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/22c4c772e3c9cbfe4f686d2fbe161b6484cdcc12"><code>22c4c77</code></a> (workflow-cli) - apps: change drycc run to async</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/a9e6369153255a6cc84dc73e3095086a34d25ad1"><code>a9e6369</code></a> (workflow-cli) - ps: add pod logs support</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/2bc31c8a2010e147b92827a967238e88dca5b743"><code>2bc31c8</code></a> (workflow-cli) - limits: add limits plan support</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/f40398a555e67a942fbe465d29e1076516941d74"><code>f40398a</code></a> (workflow-cli) - pipeline: add dryccfile support</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/03638ffdaefab5e0c7020f6eb279ddeda99aeded"><code>03638ff</code></a> (workflow-cli) - tls: add tls events</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/91136274d87d2cf9e0d2a1dd313d9b948a5d0a81"><code>9113627</code></a> (workflow-cli) - config: add typed values</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/43ee760c4bc93bc5e5402536a09f05dfd6832b7d"><code>43ee760</code></a> (workflow-cli) - auth: add tokens api</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/50dfe6449cbf50bfcf55421f34f2195cb8d7e26c"><code>50dfe64</code></a> (builder) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ab09b243b8484d8a989327e8e3b41f2a23efa643"><code>ab09b24</code></a> (controller) - healthcheck: delete outdated code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/52019b541aaaca98b2b6692fec1290d1231e21fe"><code>52019b5</code></a> (controller) - services: default PORT change error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f57ae429fa4d9dbd89c7cf81f805fe9127930219"><code>f57ae42</code></a> (controller) - certificate: failed to create certificate</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/30c3f548324dcfa571a86afbed64ba0d38b72e99"><code>30c3f54</code></a> (controller) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/dbba43ae315644e858eb2330d52cbf636a366a07"><code>dbba43a</code></a> (controller) - service: update port error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e0459c5d43a74c2c38aae6ebf3e207ad8cc9f283"><code>e0459c5</code></a> (controller) - copy: use deepcopy replace copy</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2122479685d9ce83c986449e20a041de105a2d49"><code>2122479</code></a> (controller) - charts: failed to call webhook</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/53d99775d66648aca41b88992df4ee203cb8f675"><code>53d9977</code></a> (controller) - signals: config limits handle error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/afda287ead80e94a699b3548c01fdfdbd1a6f5a4"><code>afda287</code></a> (controller) - limits: always set default</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/b350cb89e4c313d776592e9e4706909ee72550b5"><code>b350cb8</code></a> (database) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/b48a42243e602637fb04f14cb74d23e23096e2e2"><code>b48a422</code></a> (fluentbit) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/7cebca2a2589c839efbe49cbec6becde85149a8e"><code>7cebca2</code></a> (gateway) - cert-manager: auto tls error</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/190c19bbac3386e277bd7918be5b7f7ad5a25566"><code>190c19b</code></a> (imagebuilder) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2c6a6f9273a0f5e2c16744f6ac6e77d27a7234a2"><code>2c6a6f9</code></a> (logger) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/10bb98df862bebefcf4142e88c24e8f804e310ba"><code>10bb98d</code></a> (monitor) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f8225dca4c4ceae7bc4d613e77ae4c8ebf71838c"><code>f8225dc</code></a> (passport) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/06db66c072006f79c10404812ad9f0902cfb52b7"><code>06db66c</code></a> (prometheus) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/f4aff727962b6afe99e89283ce14ebe8d571d9ab"><code>f4aff72</code></a> (rabbitmq) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/88c18ff452bdd478f49dd88f6595ea096e430f2d"><code>88c18ff</code></a> (redis) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5dcc19d6d47ea30b799ae10e915ebd948b39fc4c"><code>5dcc19d</code></a> (registry) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/092a9398243f19e41ac14cc5fb4f76473848c585"><code>092a939</code></a> (registry-proxy) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/3597ac918db548f837b3262a033d836690378972"><code>3597ac9</code></a> (storage) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/5a49b35d2197c957e43a98e94d38ac8a8ebd894b"><code>5a49b35</code></a> (timeseries) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/0c4a48a84b998b8e7f57f09f307930630e8efd74"><code>0c4a48a</code></a> (workflow-cli) - tls: change issuer options</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/06a2511195bc1f2a3145a73269428200914b4694"><code>06a2511</code></a> (workflow-cli) - tls: info error</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2f7617e164707830b52f2ca39c7f634ca53842ed"><code>2f7617e</code></a> (builder) - go: bump controller-sdk-go version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/aae2f2911197e4643e7a999944401d2e5acd884d"><code>aae2f29</code></a> (builder) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7304980fb22cd0d56e1fa5b1e573b4795ef2ddd9"><code>7304980</code></a> (builder) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/30b648b0d429ba08f89e1d3b49078e40eae2d897"><code>30b648b</code></a> (builder) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2afa006867a3d4d4501578f0973ff759d87af87f"><code>2afa006</code></a> (builder) - controller-sdk-go: bump version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d127a9070a6dd0be1d96860c719d3b4a71eb7bb9"><code>d127a90</code></a> (builder) - config: add typed values</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/32fdfd0e7f54793d3ced05ff42b300173debe866"><code>32fdfd0</code></a> (controller) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0974942fb8a70d9165ef6524744850cf72629a0c"><code>0974942</code></a> (controller) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f401e08d3ffbfee5d84410ad8e31c18a3267513e"><code>f401e08</code></a> (controller) - python: bump python 3.12</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c565959af53e6ab7be7245faea09fd1a30972ac7"><code>c565959</code></a> (controller) - celery: remove retrieve_resource task</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/47be1a10b03d7522a9bc87b9973c8f126db95478"><code>47be1a1</code></a> (controller) - requirements: bump drf 3.15.1</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/99f7468e561d596121bc981294e6ca4baaed2728"><code>99f7468</code></a> (controller) - charts: add config to values.yaml</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7d17f5ca716596ef66046eb5f3606215feb87731"><code>7d17f5c</code></a> (controller) - scale: prohibit scale when there is a running pipeline</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f09e1c9475e64840ff02e23cee30f5911b507a58"><code>f09e1c9</code></a> (controller) - resource: sort services and plans</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e817505fc5dc6a2e9b959b9fd7d63c044f17fcf1"><code>e817505</code></a> (controller) - limits: change default cpu and gpu name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5531b2ff4b15a6b9804cc0b146b69ee7308a1a83"><code>5531b2f</code></a> (controller) - auth: add password login</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/27473f72e8b7c1f1b6bb9c56493688f346bbcc9c"><code>27473f7</code></a> (controller) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c1ee1c7a3103c938b8b81219da7b14cd30f3eceb"><code>c1ee1c7</code></a> (controller) - deps: bump aiohttp from 3.9.3 to 3.9.4 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/affbcb587360d7750f3faf4d022e36032f0b3266"><code>affbcb5</code></a> (database) - postgres: add patroni and postgres params (#15)</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/f9e4edaf9a2a22b974a2aced48a7890f767da0c0"><code>f9e4eda</code></a> (database) - dockerfile: install vi</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/008b7b675c244d2aff9b86947fe907dbb84185f4"><code>008b7b6</code></a> (database) - dockerfile: install vim instand of vi</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/dbbfee12b2fe9c773d32660a6bcf26674ae2cd61"><code>dbbfee1</code></a> (database) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/2e26c333df5aa90243cff8c5159a6c3a9b499a00"><code>2e26c33</code></a> (database) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/a1b81f20f517743d9f69ecda526095a4e9c3ee36"><code>a1b81f2</code></a> (database) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/bc725e8169b25eda4017012f72b5d970147f0d08"><code>bc725e8</code></a> (fluentbit) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/5d738865825bd083561972373a5dd8796a53be6c"><code>5d73886</code></a> (fluentbit) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/b85072d0177447ac3f05f1f4ccd4c9d7f4a56f99"><code>b85072d</code></a> (fluentbit) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/761174ddb5bc06643a02c145714587816ea06f8a"><code>761174d</code></a> (gateway) - gateway: change secrets name</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/1c304da25eef99568badf3ece29639dd6d8f8564"><code>1c304da</code></a> (gateway) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/b919a4c24b5abb776876df002cc9d4c15cf3d50d"><code>b919a4c</code></a> (gateway) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/3cea298be74856a2fba40b0a35824e0f3018dcab"><code>3cea298</code></a> (imagebuilder) - charts: allow all dns</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/653bcbeec95adcea209299751a3a94f3ebaf2d4f"><code>653bcbe</code></a> (imagebuilder) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/59daeab055610ce6cc584be73dba3767158b9747"><code>59daeab</code></a> (imagebuilder) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2834a5acb914eecb7708ad3bd3efdcc38243d784"><code>2834a5a</code></a> (logger) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6685492c2a8493bad3b59dedb201576f7508ff86"><code>6685492</code></a> (logger) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/191cdaf001ab5b916b0edf53aaa2a7558ef7f35a"><code>191cdaf</code></a> (logger) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/b3c3cfa319fe46d30696a2f4637f91636398ffff"><code>b3c3cfa</code></a> (monitor) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/796799db309de06ea54db56a1c0e5f397c858f47"><code>796799d</code></a> (monitor) - grafana: add node metrics dashboard</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/ef2a2228a27e4eddce1ff3b4b56755ab013c47cd"><code>ef2a222</code></a> (monitor) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9c830909640fddca03329d4a72eb91ab1d913c86"><code>9c83090</code></a> (monitor) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/1a97c2cedd3ace5c567bf32dbd057bd215502662"><code>1a97c2c</code></a> (passport) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/353e1ae932ea4dae5112b8f8225ee502695b11ee"><code>353e1ae</code></a> (passport) - logger: add oauth2_provider logger config</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/fe735c0d8c5a2840349b27ceb081d02729ae50bf"><code>fe735c0</code></a> (passport) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/41d6144a20f24461e1a393d4b1957f5be19f4f3a"><code>41d6144</code></a> (passport) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/979d4740bdd50a12f5110144cf413c3972164c90"><code>979d474</code></a> (passport) - python: bump python 3.12</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/e9f41a121e11becd9dcd6b5422dcc6e209cbeedf"><code>e9f41a1</code></a> (passport) - requirements: bump drf 3.15.1</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f479f4d5791ac2917679b70f376ec9bf24fa1fd4"><code>f479f4d</code></a> (passport) - charts: add migrate job</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/ad9abf64ad7e2b959d565eaa0016066183444cd0"><code>ad9abf6</code></a> (passport) - passport: migrations add run_before</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/95ac66705669bd4301af9d3ae812e0843eb6a37c"><code>95ac667</code></a> (passport) - passport: optimize the use of master and slave database rules</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/204f7fc62fd0cdf016cd5e95a4d2fd2e6c841b17"><code>204f7fc</code></a> (passport) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/90a6410c0d0864a434b804cf80fe63960afd4493"><code>90a6410</code></a> (prometheus) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/2d8eb44ef28deae27ac54247a008a5351212eea0"><code>2d8eb44</code></a> (prometheus) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/9687a175b58aed22d314557d7254a82ff0a6d3dd"><code>9687a17</code></a> (rabbitmq) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/35d3d5b7e01bebbeeea5442a22f24d40fcbfdd93"><code>35d3d5b</code></a> (rabbitmq) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/6a6564ddef4f26bc81ea3eb9e965fb8e6180d092"><code>6a6564d</code></a> (rabbitmq) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/cb6722f0df93fae95d4480e1929b55e1e78a2a3a"><code>cb6722f</code></a> (redis) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/9553497d89e358022ab539cb3db658def17bc9cb"><code>9553497</code></a> (redis) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/1c8dc07b0167126d292e3db45f23db5d6ff111dc"><code>1c8dc07</code></a> (redis) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/9fa2a32f965d282940cd3f8489ce8959bb2e791f"><code>9fa2a32</code></a> (registry) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/9b09e51c1d548ba4d1c088aff761391092d746e3"><code>9b09e51</code></a> (registry) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7dbd3902139c8430c18bfb83e4dbce79a6df16a5"><code>7dbd390</code></a> (registry) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/e1d2a33d8c9f20eddce510d79df050b0fe90a94c"><code>e1d2a33</code></a> (registry-proxy) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/3eabfdda5c2a78fc49e73dce382263faad29f5c3"><code>3eabfdd</code></a> (registry-proxy) - charts: remove default limits</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/f8754dad5de5f88bb0f20f46d73e1cbab2aff68e"><code>f8754da</code></a> (registry-proxy) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7df73166e6ea521587eb2ba5b8e1626cc334d7f3"><code>7df7316</code></a> (registry-proxy) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/861d3b8f5ebc2ee32f11a600b26a14d79e0acdf1"><code>861d3b8</code></a> (storage) - filer: modify the default parameters of the filer</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/5fa08da71087503071fa780ac2469f4d55e7d0c5"><code>5fa08da</code></a> (storage) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/22c4620e0e724b26943260d58d749bb4efd0999b"><code>22c4620</code></a> (storage) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/6c1e29c1bf187e2b754d6f683014dba7a4ebe342"><code>6c1e29c</code></a> (timeseries) - postgres: add patroni params</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/e280d3ff2d799fa1e0738bf6e7585aaba0e72c58"><code>e280d3f</code></a> (timeseries) - dockerfile: install vi</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/5213617c4a5ace9225e1cad8348c736b943c5e25"><code>5213617</code></a> (timeseries) - dockerfile: install vim instand of vi</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/a569a57f06484738d5801651f9e253553347f928"><code>a569a57</code></a> (timeseries) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/b93ec702dcbd0e2306d0290cde2d104d4c5897f3"><code>b93ec70</code></a> (timeseries) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/ff3b8705e65a56f0da392519b54f9b060894ec8c"><code>ff3b870</code></a> (timeseries) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/e334f74a71ffbd5f10baa38da43248d92c051322"><code>e334f74</code></a> (workflow-cli) - healthcheck: delete outdated healthcheck style</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/4f8b960e9ddcd1351b4567935d0a8d98d2aa843d"><code>4f8b960</code></a> (workflow-cli) - auth: add password login</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.5 + /blog/2024/02/27/drycc-workflow-v1.7.5/ + Tue, 27 Feb 2024 00:00:00 +0000 + + /blog/2024/02/27/drycc-workflow-v1.7.5/ + + + + <p>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.</p> +<h2 id="workflow--v174---v175">Workflow ## v1.7.4 -&gt; v1.7.5<a class="td-heading-self-link" href="#workflow--v174---v175" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.5.0 -&gt; v1.5.1</li> +<li>controller v1.6.3 -&gt; v1.7.0</li> +<li>logger v1.3.2 -&gt; v1.3.3</li> +<li>storage v0.0.3 -&gt; v0.0.4</li> +<li>redis v1.3.1 -&gt; v1.3.2</li> +<li>rabbitmq v1.2.0 -&gt; v1.2.1</li> +<li>registry v1.2.1 -&gt; v1.2.2</li> +<li>workflow-cli v1.5.1 -&gt; v1.5.2</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/95d130a19f63544defbf415d63ea44b650d07da7"><code>95d130a</code></a> (controller) - controller: volume support nfs</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ee2ee15992331922728aabcf03420fbad7b76a1d"><code>ee2ee15</code></a> (controller) - controller: container entrypoint error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/03ea4f87b58f2e3f12505ff0ba43ab655fdf0528"><code>03ea4f8</code></a> (controller) - controller: class property have been deprecated in python 3.11</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5f04d177fa399a7859d4f0d8e13b58e77983c2e9"><code>5f04d17</code></a> (controller) - controller: miss err msg</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/27972a3a48f5fb67283c50b95e58da7b7ef05458"><code>27972a3</code></a> (controller) - controller: load_db_state_to_k8s err</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a005d629bbdd9a5d68f5bb4c480fd9e6b51300c7"><code>a005d62</code></a> (controller) - controller: volume repeat path no error</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/c7a5ba62b8e513f43aad8143e507d23885558834"><code>c7a5ba6</code></a> (rabbitmq) - rabbitmq: cpu usage to high</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/45c20770d8203ae475c127fe82b00bd04334507d"><code>45c2077</code></a> (workflow-cli) - workflow-cli: miss err msg</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/bc738bd6ef19fa222e675058bc0af79b75026308"><code>bc738bd</code></a> (workflow-cli) - workflow-cli: volumes list format</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/35e1c063c5f40fc97f60ab2a0b9f66de37eef383"><code>35e1c06</code></a> (builder) - builder: bump golang 1.22</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/26caa36c197b968909da1a584dff686cd6bcd651"><code>26caa36</code></a> (controller) - deps: bump aiohttp from 3.9.0 to 3.9.2 in /rootfs (#118)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d938c4f00b4a972abe948dc814b2cbf41ea2b3b"><code>3d938c4</code></a> (controller) - deps: bump django from 4.2.7 to 4.2.10</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/e625c2f86176c0acff331f58f84da15d96041f21"><code>e625c2f</code></a> (logger) - logger: bump golang 1.22</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/bfa500dc9271bf0a475c50feb8e6be8574953bcd"><code>bfa500d</code></a> (redis) - redis: headless svc does not require ports</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/330209a5c329c0f34b47a07812e7282ad7890208"><code>330209a</code></a> (registry) - registry: headless svc does not require ports</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/48c42eb3d6ef09471d26a65c88f5cd88cd6684e8"><code>48c42eb</code></a> (storage) - storage: change volume index to leveldb</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/f4fde9d2c871162c14ecf0e993093211f49e7c66"><code>f4fde9d</code></a> (storage) - storage: add volume size limit</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/33e3684ec520a83bccdf7623d4b3d1317c10e9a0"><code>33e3684</code></a> (workflow-cli) - workflow-cli: volume support nfs</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/48d59507ab5f40e8a8cea9875b230e9e1b97644d"><code>48d5950</code></a> (workflow-cli) - workflow-cli: bump golang 1.22</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.6 + /blog/2024/02/27/drycc-workflow-v1.7.6/ + Tue, 27 Feb 2024 00:00:00 +0000 + + /blog/2024/02/27/drycc-workflow-v1.7.6/ + + + + <h2 id="workflow--v175---v176">Workflow ## v1.7.5 -&gt; v1.7.6<a class="td-heading-self-link" href="#workflow--v175---v176" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>storage v0.0.4 -&gt; v0.0.5</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/6cb63b632ab24cecda10e2e772f46e499d678aa5"><code>6cb63b6</code></a> (storage) - seaweedfs: bump version 3.63</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.2 + /blog/2024/01/29/drycc-workflow-v1.7.2/ + Mon, 29 Jan 2024 00:00:00 +0000 + + /blog/2024/01/29/drycc-workflow-v1.7.2/ + + + + <p>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.</p> +<h2 id="workflow--v171---v172">Workflow ## v1.7.1 -&gt; v1.7.2<a class="td-heading-self-link" href="#workflow--v171---v172" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>controller v1.6.0 -&gt; v1.6.1</li> +<li>logger v1.3.1 -&gt; v1.3.2</li> +<li>storage v0.0.1 -&gt; v0.0.2</li> +<li>timeseries v0.0.1 -&gt; v0.0.2</li> +<li>prometheus v0.1.0 -&gt; v0.1.1</li> +<li>workflow-cli v1.5.0 -&gt; v1.5.1</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2fe80a65e2f564abe94a04a4018af101ca10d55d"><code>2fe80a6</code></a> (controller) - resources: after resources instance update, could not delete (#111)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a4082ad0c4fca861bc713864ec4539249b707c0e"><code>a4082ad</code></a> (controller) - controller: resource status and binding</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e9bfccc307fd9631361eaedd1db0c98fb11f7a9b"><code>e9bfccc</code></a> (controller) - controller: fix multiple volumes mount at one dir error (#116)</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/58d2b4c35020c25e133f46bb48f7b512e41a0f91"><code>58d2b4c</code></a> (logger) - logger: redis conn error block</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/7cb2700c483040869f3fa5ff1af76cf68d8e8711"><code>7cb2700</code></a> (prometheus) - prometheus: prometheus config basic_auth</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/7838c6b63eec363ec0fccbc8a2b455477edb69db"><code>7838c6b</code></a> (storage) - storage: random accesskey secretkey</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/d9dcdfb7350c003a60883c9e70e3afca730d5419"><code>d9dcdfb</code></a> (storage) - storage: pod restart loses data</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/3cbdd29c8dd94d7bd046a3fe817dabbb59887225"><code>3cbdd29</code></a> (storage) - storage: tipd cannot start after deleting pod</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/be7e11fe5a8a861a976c27b69331779b4edd0a3a"><code>be7e11f</code></a> (storage) - storage: jq command not found</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/878f674be07b4aee660ec66830a9fe29473bdaba"><code>878f674</code></a> (storage) - storage: charts updateStrategy error</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/06cfe561e1327690dfcccd7151711053b8126a9a"><code>06cfe56</code></a> (timeseries) - timeseries: the data node ip is incorrect</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7f29f5a98049b0c256728dad38cf63026c45910e"><code>7f29f5a</code></a> (controller) - resources: retrieve resource instance response add message (#112)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4a84dcdca75a3c1cd037c01777cf410c21c56225"><code>4a84dcd</code></a> (controller) - controller: add deploy default annotations (#113)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/829d7e560317a0ac20081f6bd4c81f53b547aac4"><code>829d7e5</code></a> (controller) - controller: modify url match service name (#114)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/30abf6dba46d215d7747b4443826e6e3fac1138a"><code>30abf6d</code></a> (controller) - controller: transfer app ownership in async</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/dc6f45e98ab77a776a620286465da106a8109ba6"><code>dc6f45e</code></a> (controller) - controller: add channel for pod exec</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/af4f3a771d8a7c6f1f99c17acb67704d9f3f921f"><code>af4f3a7</code></a> (controller) - controller: avoid error when secret no data field (#117)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ca27956696aa6bd2e4adefcc6827f840eefd4b34"><code>ca27956</code></a> (controller) - controller: add pod default security</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/b2e9c647ff2a1e7828946d363b6cfc5bdca2deb7"><code>b2e9c64</code></a> (prometheus) - charts: node-exporter mount root (#2)</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/3cdb2b62fe9e2d6f7506c5215be9e3e7d27254b3"><code>3cdb2b6</code></a> (storage) - storage: bump seaweedfs 3.61</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/00dd2fd331104fd4f7ee58ca35a0906588318d16"><code>00dd2fd</code></a> (storage) - storage: add csi daemonset updateStrategy</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/48e763cb34c3e9b1004ad222a1e4670739e0b9ba"><code>48e763c</code></a> (storage) - storage: add drycc storage upgrade document</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/841df90682a121df819ea11ba8d2dc7843ffcd54"><code>841df90</code></a> (storage) - storage: bump seaweedfs 3.62</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/cefd52e7b031efc05f305a8d8f456229418556f8"><code>cefd52e</code></a> (timeseries) - timeseries: add check data node exists</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/ad1c46e39f392dd676a0f5c8e00b05ed1959cb95"><code>ad1c46e</code></a> (workflow-cli) - resources: resources instance add message</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/9f955c2c97a0a2875f7badadb4f868649cf44b2e"><code>9f955c2</code></a> (workflow-cli) - workflow-cli: add short options cpu</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/65399ef156b9fae2d2fe633cb6b4b63fb6263a1c"><code>65399ef</code></a> (workflow-cli) - workflow-cli: add tty resize support</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.0 + /blog/2023/12/08/drycc-workflow-v1.7.0/ + Fri, 08 Dec 2023 00:00:00 +0000 + + /blog/2023/12/08/drycc-workflow-v1.7.0/ + + + + <p>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.</p> +<h2 id="workflow--v160---v170">Workflow ## v1.6.0 -&gt; v1.7.0<a class="td-heading-self-link" href="#workflow--v160---v170" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.4.0 -&gt; v1.5.0</li> +<li>controller v1.5.1 -&gt; v1.6.0</li> +<li>database v1.2.0 -&gt; v1.2.1</li> +<li>passport v1.1.0 -&gt; v1.2.0</li> +<li>imagebuilder v1.1.0 -&gt; v1.1.1</li> +<li>fluentbit v0.0.0 -&gt; v0.0.1</li> +<li>logger v1.3.0 -&gt; v1.3.1</li> +<li>storage v0.0.0 -&gt; v0.0.1</li> +<li>gateway v0.0.0 -&gt; v0.0.1</li> +<li>monitor v1.3.0 -&gt; v1.4.0</li> +<li>redis v1.3.0 -&gt; v1.3.1</li> +<li>timeseries v0.0.0 -&gt; v0.0.1</li> +<li>prometheus v0.0.0 -&gt; v0.1.0</li> +<li>rabbitmq v1.1.0 -&gt; v1.2.0</li> +<li>registry v1.2.0 -&gt; v1.2.1</li> +<li>registry-proxy v1.2.0 -&gt; v1.2.1</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fcbebdae62029cf4308ffc0adeb8a90cf5550077"><code>fcbebda</code></a> (builder) - builder: use TCPRoute expose service</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d02bb5de832e50a281aa550c738b3eb653549806"><code>d02bb5d</code></a> (controller) - controller: support app dns policy config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9aa968ebccdebaf0971a6dbaa890320b9603a6a9"><code>9aa968e</code></a> (controller) - controller: add svc type support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/62e2d348e2987ebcdcaba993559dc1d30a8ffec6"><code>62e2d34</code></a> (controller) - controller: improve the services api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4393755b08a587e093b7603683ac8b5cdf654ac3"><code>4393755</code></a> (controller) - controller: use gateway replace ingress</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/323045d9ab1589c08a8090d7fe9c73ab6276281d"><code>323045d</code></a> (controller) - controller: add canary support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3f81c975baefd4018e6b3426965b4397456f0d0e"><code>3f81c97</code></a> (controller) - gateways: add addresses field</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4e64aa73d0fde9fe667064b420bd9375dbea8397"><code>4e64aa7</code></a> (controller) - gateways: add addresses field</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/02ad5811d9a8d3e031ce97f8ce85d0ce85be7619"><code>02ad581</code></a> (monitor) - grafana: add pd tikv dashboard</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/2a9e2b042941a911a31c846f71988d6eadeff811"><code>2a9e2b0</code></a> (monitor) - monitor: add storage monitor</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/41d5057b1d4067822edcf597e888b3f23e052d9d"><code>41d5057</code></a> (monitor) - grafana: data source change to prometheus</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/ec035d11f3fcf8486f4240aac8db4890e4520b53"><code>ec035d1</code></a> (monitor) - monitor: usegateway replace ingress</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c694c98cfab10d8381fd70d7efbbdaedc26caf2d"><code>c694c98</code></a> (monitor) - grafana: add drycc storage seaweedfs dashboard</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/1e1fdc8a8f3ca0974ff5d06ade500afed29a16ed"><code>1e1fdc8</code></a> (passport) - passport: use gateway replace ingress</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/ffdb408776bfa42c80ba5df56730c689a26a821a"><code>ffdb408</code></a> (prometheus) - prometheus: use gateway replace ingress</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/04152b99ca9a8aacddc246af78968191e41ea9d7"><code>04152b9</code></a> (rabbitmq) - rabbitmq: use gateway replace ingress</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0499500a1335791a89ffcab18e97b22d55ac232c"><code>0499500</code></a> (builder) - builder: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/642491d68a4958cdd6b9b78771ad512d7a462231"><code>642491d</code></a> (builder) - builder: no build log</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/873d146812f40de609100d9a2181d50e79695a54"><code>873d146</code></a> (controller) - controller: do not set entrypoint when no procfile</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d9028c53547b4d53d46d5cba508602ae31d0b391"><code>d9028c5</code></a> (controller) - controller: pip8 error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3efcfb764325255ff9ae4ca47ab82927e88ff9ab"><code>3efcfb7</code></a> (controller) - controller: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/18a3a1a3f777597966da8f8fb21545a18b44d887"><code>18a3a1a</code></a> (controller) - controller: miss service error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/94f796cd2ebd8dd76b4e8073cab039fed0211cae"><code>94f796c</code></a> (controller) - controller: drycc run pod should not restart</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/80f31614601daf30351033c3d9ce8610d4a41581"><code>80f3161</code></a> (controller) - controller: monitor query error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b76f2c5ee9c0e3461737ec7fc6cc73b73a0c043c"><code>b76f2c5</code></a> (controller) - controller: read websocket delay</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b6e068ee19354b98d613985c8c80ec6d42171cc0"><code>b6e068e</code></a> (controller) - controller: metrics sql tpl, gateway pod should not restart, cleanup old rs, update monitor datatbase config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ad9adc645759445702688b2a486ed5d6a1e6a5f7"><code>ad9adc6</code></a> (controller) - controller: rabbitmq sharding err</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/67739075a1134b817e9be97b7d594c1e3790f444"><code>6773907</code></a> (controller) - controller: default k8s pod annotaions</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ffcf1f931c395c3293d909f32a3bf35136b72776"><code>ffcf1f9</code></a> (controller) - controller: under-indented for visual indent</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3afd0cf8e36cec5bbfb59424d5ab036268287d3a"><code>3afd0cf</code></a> (controller) - controller: charts env error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/769bb8b8dc47ef032377a61e6288c514bff16a9b"><code>769bb8b</code></a> (database) - database: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/769bb8b8dc47ef032377a61e6288c514bff16a9b"><code>769bb8b</code></a> (database) - database: label conflict error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/6a321c5c802b3a0826bc283f2ffe429769f8753c"><code>6a321c5</code></a> (database) - database: link error</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/558feae9c0edfb4fa7f0dae08f09dc987f822c88"><code>558feae</code></a> (fluentbit) - fluentbit: build charts error</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/98d8a2a6046dffa3213f84fd5cb2f054727ca798"><code>98d8a2a</code></a> (gateway) - fixup</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/8b5dde1d5b0107913f3fca7c90703902fd9a360e"><code>8b5dde1</code></a> (gateway) - gateway: secretName</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/702866da3014497e303eb346be0f88c3c161586c"><code>702866d</code></a> (gateway) - gateway: build status</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/f55dac1cbab3214f60b33992f3e08e186bfa6198"><code>f55dac1</code></a> (imagebuilder) - imagebuilder: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/ac13b5f036e036073d39ddf2e34627be340df078"><code>ac13b5f</code></a> (imagebuilder) - imagebuilder: build svg</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6b7bbc5a38a8550457585908ac7ce9858c19a034"><code>6b7bbc5</code></a> (logger) - logger: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/0136b5c3ac711f132be35d8382f9df9268145be6"><code>0136b5c</code></a> (monitor) - monitor: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f03d975fe88a4419f58b54f8d1ac944f968b0bfe"><code>f03d975</code></a> (passport) - passport: DRYCC_GRAFANA_DOMAIN error</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/b530ea8960c173b16968dc5c4da5f8e5f783d9dd"><code>b530ea8</code></a> (passport) - passport: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/be5a0a77f5e037456676af5617cdcd01c2f868ea"><code>be5a0a7</code></a> (passport) - passport: change passport</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/1596c7f723d493b8f17e367999e0315d7f2bc205"><code>1596c7f</code></a> (rabbitmq) - rabbitmq: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/0dc4f6fef0bf147e2cec96cd26f490ae5799fa57"><code>0dc4f6f</code></a> (rabbitmq) - rabbitmq: images-shard error</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/43293ae792f0fc8fa932b7fac865f57510de793d"><code>43293ae</code></a> (redis) - redis: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ca13b7d7592995b057f1075b3223074c7a9de54b"><code>ca13b7d</code></a> (registry) - registry: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ab5c7937aac830c2b09b08777f39180248911442"><code>ab5c793</code></a> (registry) - registry: garbage collect error</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/ab0fabc77483f531acaeaa089afce1636200c20a"><code>ab0fabc</code></a> (registry-proxy) - registry-proxy: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/dfc72361f70380697d7090cb0e5bfa61c5264560"><code>dfc7236</code></a> (registry-proxy) - registry-proxy: daemon yaml format</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/42c03bee957cb46b5703cd163cea24c754b3cccc"><code>42c03be</code></a> (storage) - storage: seaweedfs csi error</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/453e41a13ecaedf256dc823c37de3233a2f60cab"><code>453e41a</code></a> (timeseries) - timeseries: could not register node</li> +</ul> +<h4 id="docs">Docs<a class="td-heading-self-link" href="#docs" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/5433c8907bdf4c0320566878a0cfc4f38730f3d4"><code>5433c89</code></a> (gateway) - gateway: add prerequisites</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2f0c5d8ed5a227507f7848426824759db673eb20"><code>2f0c5d8</code></a> (logger) - logger: change architecture</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/bdd02ebf1178209cca08c0e94d76638405100083"><code>bdd02eb</code></a> (builder) - builder: use dynamic clusterrole name</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/66b4b25ec7c517152a37e375f9a7e86e05cceada"><code>66b4b25</code></a> (builder) - builder: upgrade new controller-go-sdk</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/219d86f6bebf11fce80e2535b724bf8ad94b204b"><code>219d86f</code></a> (builder) - builder: upgrade go.mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/91f2f14b0b02af099fe67d4a9be65432de0cb18d"><code>91f2f14</code></a> (builder) - builder: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9abca168d6a8b26f45a3787c2a80bf5aa6354451"><code>9abca16</code></a> (builder) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f43dd5030ac3715ab96cfb2a114bd0416b21110c"><code>f43dd50</code></a> (builder) - deps: bump golang.org/x/net from 0.2.0 to 0.7.0</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0384c69ad46cdabeabb3ca23d01367d047eb0c84"><code>0384c69</code></a> (builder) - builder: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e3149b95e8c64c1d01444d58de67aa4747c4ebf7"><code>e3149b9</code></a> (builder) - builder: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d88ea1bd5538e5425cb4cbb856ab82bb5dfe47e8"><code>d88ea1b</code></a> (builder) - builder: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ba590303b791ff954e41a64ef8babe54170aba3b"><code>ba59030</code></a> (builder) - builder: upgrade go.mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1114dd7d951215c23a6fcefc75a5a71a85391561"><code>1114dd7</code></a> (builder) - builder: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fe50b626d9edf4908f6c820fa2714e5bde0fbc0e"><code>fe50b62</code></a> (builder) - builder: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/db3950cf47cd8f5f0c06c579eec1189c2bcdb0b3"><code>db3950c</code></a> (builder) - builder: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5a508bbc9e21852c4e47e598bb42a7c8c75e93ee"><code>5a508bb</code></a> (builder) - builder: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/bbb9029e773f24d2692afdd801e8d09ca75538a3"><code>bbb9029</code></a> (builder) - deps: bump golang.org/x/net from 0.12.0 to 0.17.0</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f4e5d6ca78d597e020ce398fd9fd132c41591826"><code>f4e5d6c</code></a> (builder) - builder: remove health url</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9111c8ffd87978db6734d405ef0362c34b9fe4ef"><code>9111c8f</code></a> (builder) - builder: remove io/ioutil</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1f36e3ddd67b29571707c57819bdd8148647359c"><code>1f36e3d</code></a> (controller) - deps: bump django from 4.1.2 to 4.1.6 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e4ab434db6fd84cd35a127c8414951df7e138503"><code>e4ab434</code></a> (controller) - controller: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9f0301e4a138d337d9530807b347775d25ee6525"><code>9f0301e</code></a> (controller) - deps: bump django from 4.1.6 to 4.1.7 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/39324238c251f982072b28fdbb79c04df6230889"><code>3932423</code></a> (controller) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ae8b6b464f3733bd0ca743bd419ecf806646909f"><code>ae8b6b4</code></a> (controller) - setting: support KUBERNETES_LIMITS env config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c10b9bc740f74ed820d36ba5cb6eb462bce3bb7c"><code>c10b9bc</code></a> (controller) - controller: using the api_version instead of hard coding</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e6908cd934ec0360344c2120bbd4bd9a27b6fe9d"><code>e6908cd</code></a> (controller) - controller: upgrade requirements</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b0eba0c0f03b3b74bf6b2d013a8e2fd69dd5fc6c"><code>b0eba0c</code></a> (controller) - controller: add route rules serializer</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2e4b6a457f6ab66137badecaa0ce5a020e2208e2"><code>2e4b6a4</code></a> (controller) - controller: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7d32b55dad2a0da5a2d539c970608182dfd00c52"><code>7d32b55</code></a> (controller) - controller: upgrade to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f2dc8dd737e44d1297f6a6903bc17392f767a828"><code>f2dc8dd</code></a> (controller) - controller: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5739b8306921408b11b921515cd6dc7a818e6a1a"><code>5739b83</code></a> (controller) - controller: use timescaledb replace influxdb</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/53892cb796b69ba91b1520ee2b1e35bf6516fb57"><code>53892cb</code></a> (controller) - controller: add timeseries</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0fe0eae17d2af7e0a955d6e8041db22a66b64317"><code>0fe0eae</code></a> (controller) - controller: upgrade requirements</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/18b2a915d043cade51e0d4017d08e4ffa9f54dd6"><code>18b2a91</code></a> (controller) - deps: bump aiohttp from 3.8.4 to 3.8.5 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f50874a6e180d9a18fd3a9b9ad1ec1491acae114"><code>f50874a</code></a> (controller) - controller: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/956cd081922f8eeda637530e8397a40d9f7d9c3d"><code>956cd08</code></a> (controller) - controller: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9ab3ead47263e0f00f5d31afdad028eedefd6a56"><code>9ab3ead</code></a> (controller) - controller: remove passport url check</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a24c7b011de56845fcc0ffaa78424d60e6cb8aac"><code>a24c7b0</code></a> (controller) - controller: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f7e539acb9890593d5b3ba970221f333b81abff5"><code>f7e539a</code></a> (controller) - controller: change celery priority</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ab77a529bc9ac2e61a45af4676b8d8796789f014"><code>ab77a52</code></a> (controller) - controller: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8e27501fc6f024bd590508ad827d6a28ca871776"><code>8e27501</code></a> (controller) - controller: dynamic app storage class</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/385978b8f8a07696196974f7f021886448fbc31c"><code>385978b</code></a> (controller) - controller: list_pods datetime format</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b20362c09cf14cbb64148476948481bca11fcf99"><code>b20362c</code></a> (controller) - deps: bump django from 4.2.3 to 4.2.7 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e11ae1ba7d5ef0423b6a51874704739e6a3c86df"><code>e11ae1b</code></a> (controller) - controller: add cluster migrate</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ca6e9dfa4e90c613572faf449445cebabcf1a310"><code>ca6e9df</code></a> (controller) - controller: async mount</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9a7fbfc5e7037dbcd6f8415da1540fc0d0785bff"><code>9a7fbfc</code></a> (controller) - controller: remove FOSSA</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d55279d81f93783dfdcf0af47c429094fd45019"><code>3d55279</code></a> (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d498a11d8c1179d9ef7e09d4638b10663fc3266d"><code>d498a11</code></a> (controller) - controller: add measure loalancers</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/249a985410e98ab0250af7eaf88c28735f2d7ef1"><code>249a985</code></a> (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b967f5846a006e03d41374266d689a34bd387ba8"><code>b967f58</code></a> (controller) - deps: bump aiohttp from 3.8.6 to 3.9.0 in /rootfs (#107)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8ca9ed61477fe4c538b0eefbe08f42757f9ec527"><code>8ca9ed6</code></a> (controller) - controller: no longer restrict reserved domain</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9ff6649b311185927398a12d55451897015ba491"><code>9ff6649</code></a> (database) - database: add init database configure</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9b4cd26e827862bbcbd2f95eb9ff5aea3031ef80"><code>9b4cd26</code></a> (database) - database: use dynamic clusterrole name</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/b59cde4a41499b1739f51776524c969963706a1e"><code>b59cde4</code></a> (database) - database: remove minio require</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/86462f8e432c21ed691f17544313747a1a95bf2a"><code>86462f8</code></a> (database) - database: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1e8555a4fa0aa4ab14e276af95eeadb11e7ea2f3"><code>1e8555a</code></a> (database) - database: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1b762d54948614e8ff8179f91ba4087c1c24cd93"><code>1b762d5</code></a> (database) - database: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9ffe1fdcc1d1fd33e1d5a69d38c6e2c044f7e002"><code>9ffe1fd</code></a> (database) - database: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/69466d71dfb0fac98f5e2372eae4923d2cb55dde"><code>69466d7</code></a> (database) - database: add database extension</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/beb4b628783f30b8dec35f0ee50d179a27781915"><code>beb4b62</code></a> (database) - database: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/67e27148766a6a16379bccbb160df881e8638cfa"><code>67e2714</code></a> (database) - database: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/8f328f85f28b51b0ea8ce4fe508701c2e875a668"><code>8f328f8</code></a> (fluentbit) - fluentbit: no limit buffer size for kube api</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/fc0552c72b83267e37d67766a0e1040c7d3d59d8"><code>fc0552c</code></a> (fluentbit) - fluentbit: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/63a6cab0c5004ade3c332f16d87f70daaebc12b0"><code>63a6cab</code></a> (fluentbit) - fluentbit: change fluentbit match</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/220f81adae775c21f6eac5fca0f16f2f96962e7d"><code>220f81a</code></a> (fluentbit) - fluentbit: run as no-root</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/aec1393d9e976f2ecb24281a3fc92f5f8bdcf563"><code>aec1393</code></a> (fluentbit) - fluentbit: change configmap name</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/1af4fd24c9e061cb74c3c09af75ad33262a74a19"><code>1af4fd2</code></a> (fluentbit) - fluentbit: change default stream name</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/bef90adfd96f4c713a7de261cb2c66e7cb9900af"><code>bef90ad</code></a> (gateway) - gateway: add route for gateway</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/d523ddb7f794774c5e237c10779fe43713cdc0b6"><code>d523ddb</code></a> (gateway) - gateway: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/d9137f4c7681be9edacc2f1123660d0feb961601"><code>d9137f4</code></a> (gateway) - gateway: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/0425dd4e7a0399fd757a80880e67eda2e8c150fc"><code>0425dd4</code></a> (gateway) - gateway: add customListeners</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/3982b86cb7515d42ead064dee86b931f2f4c58a7"><code>3982b86</code></a> (imagebuilder) - imagebuilder: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/3e4e7a329c7532d8787c9c76eb71d938d12fad45"><code>3e4e7a3</code></a> (imagebuilder) - imagebuilder: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/8df6e8e0e6684a4c4a21bf477958b36eb6750e97"><code>8df6e8e</code></a> (imagebuilder) - imagebuilder: upgrade stack version</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/a5601f7588843698b336eccacbc12559dc915779"><code>a5601f7</code></a> (imagebuilder) - imagebuilder: add drycc_app env</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/07465f8bc16cbb15e12d02d522df94265d503c45"><code>07465f8</code></a> (imagebuilder) - imagebuilder: upgrade to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/00d22d2a3c3fa5dce5595fee94bfa8d5a5ca9b2c"><code>00d22d2</code></a> (imagebuilder) - imagebuilder: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/0b7a24e9211acef3252234e4ebce81353c2a8218"><code>0b7a24e</code></a> (imagebuilder) - imagebuilder: upgrade podman/mc/caddy</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/a7d8be869f0b128e9fc6a28ec5c45e5cdca0ea90"><code>a7d8be8</code></a> (imagebuilder) - imagebuilder: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6b2da83d29e0210a9307e4c5ad1199ed7d7599ce"><code>6b2da83</code></a> (logger) - logger: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/8245b2588a3c350b9c1405c9e56664881534c4b4"><code>8245b25</code></a> (logger) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/f811a74710324fa3ac4ac1fbafc76fe38b042c33"><code>f811a74</code></a> (logger) - logger: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/413f6f60b255f43adbf98cfdbdf2a8325cf3327a"><code>413f6f6</code></a> (logger) - logger: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2ac6b101d2a205cce7653dcbf635cf1afea8e47e"><code>2ac6b10</code></a> (logger) - logger: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2581426b262362e04fc4906cfb7d4567ca58d40a"><code>2581426</code></a> (logger) - logger: bump redis to v9</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/364b25aebe91236be41b5974b3643fc1a2b6d352"><code>364b25a</code></a> (logger) - logger: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/dc169a303663ce319037fcf19d0b6bd164b8ee82"><code>dc169a3</code></a> (logger) - logger: use fluentbit replace fluentd</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/d855d91ba3b4651d2a384f3919a39a84f6794b95"><code>d855d91</code></a> (logger) - logger: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f76723507196a4814dc98e8d9c6403157b6273c4"><code>f767235</code></a> (monitor) - monitor: add off-cluster passport configure</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/ab23936f8d8610f88c061996217b28a8da0ffe3d"><code>ab23936</code></a> (monitor) - monitor: use dynamic clusterrole name</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/47beee0619ee974ad702d813e4db39b187a0507b"><code>47beee0</code></a> (monitor) - monitor: change tikv secret key</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/af7703f7a646a074adf89f9e1d7681bc2a4a8cfb"><code>af7703f</code></a> (monitor) - grafana: remove panel when component off-cluster</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/1b870c2a5b5212d9aeae8dd720bab8190a2b8002"><code>1b870c2</code></a> (monitor) - monitor: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/4a5f1f164c48e93271e28e5a252eb9c87ce4e293"><code>4a5f1f1</code></a> (monitor) - grafana: up ldap api_url config</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/143cabe692cd9d80f909afbe91de0bb8b3c18dea"><code>143cabe</code></a> (monitor) - monitor: add prometheus architecture diagram</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/93091c2dcde35d1ca63450ba08cd2e92b532cdda"><code>93091c2</code></a> (monitor) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/0b7045a1ec3d0061a8434e7e8beed47183287b2c"><code>0b7045a</code></a> (monitor) - grafana: add dashboard kubernetes_deployment_metrics</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/2fb1839f48277724e394b04697d1eb1fb748bf3e"><code>2fb1839</code></a> (monitor) - woodpecker: pipeline config VERSION, when build container image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e2724164a3e2855d1f62e4bdcdcff99f6b10e48f"><code>e272416</code></a> (monitor) - monitor: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/abc0e5373a0aef065fd8887e9f8bee5fd13a5e92"><code>abc0e53</code></a> (monitor) - monitor: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/86cc01bd318becf9528feffcfd7c6080c3faafa2"><code>86cc01b</code></a> (monitor) - monitor: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/1cd849ff6f8367375f6d80430e9fe623ebe0162d"><code>1cd849f</code></a> (monitor) - monitor: add postgresql outputs</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c3205c04418bbb794286eca1bcaa2bf37f26437c"><code>c3205c0</code></a> (monitor) - monitor: change default agent config</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/8c802c01af85fbf40b42c124cd6c72a7c3d8266d"><code>8c802c0</code></a> (monitor) - monitor: add timeseries database</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e9abc40801c5d90934d19b5ca1b838dbdf9b2431"><code>e9abc40</code></a> (monitor) - monitor: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6af66cd45685080c5242f6bc6758df35e0c7a69f"><code>6af66cd</code></a> (monitor) - monitor: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/d02d718b64837e2869aea66f8a9205d0d3205feb"><code>d02d718</code></a> (monitor) - monitor: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/3509c2916b9b6aabe709b0057afdacbdc747e462"><code>3509c29</code></a> (monitor) - monitor: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/ed7bfa2f0c17b3e2577f168af719a6c9b3adc436"><code>ed7bfa2</code></a> (monitor) - monitor: optimize env PROMETHEUS_URL</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/da89befad4be1c66ae33740c7a2567b8b83b6b46"><code>da89bef</code></a> (passport) - passport: charts codereview</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/61c4a964022e28f81727efdc858e5ec3a07a71fb"><code>61c4a96</code></a> (passport) - passport: support init app config</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/91010068522d524dfd6680d09915a5444e29a1ba"><code>9101006</code></a> (passport) - passport: add initApplications to charts</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/7dd7fa414f07cc61771cec2d3e98cc1a32d38a00"><code>7dd7fa4</code></a> (passport) - passport: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/4400199ac576b00e0e268ca74d18ff1da15f32bc"><code>4400199</code></a> (passport) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/6b2c546ec6a5dd0311667cab1ac322819ea71918"><code>6b2c546</code></a> (passport) - passport: change secret name to drycc-passport-auto-tls</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/c8bd824c567bfc68df8fd118ad5a9805242507bd"><code>c8bd824</code></a> (passport) - passport: upgrade requirements</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/aee5aefe0c074816b6ba99624f0e2e5fb6462516"><code>aee5aef</code></a> (passport) - passport: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2d819533a0d6e10534e5a82fac370dd67ef96fc2"><code>2d81953</code></a> (passport) - passport: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/9e662428f39d73651a0c70bd613595c7205c4494"><code>9e66242</code></a> (passport) - passport: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/0fca9982e2ff45bbb5ebe7e3e91fcf0a6af52d94"><code>0fca998</code></a> (passport) - passport: upgrade requirements</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/348252849763e5e96b5908293bd78d84b52b6ad0"><code>3482528</code></a> (passport) - passport: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/0c5ec939da419910c9e98ea97cee9d66916ba14f"><code>0c5ec93</code></a> (passport) - passport: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f7b8f5312d0e9707d2f41b14fb1113e2dfa63dc3"><code>f7b8f53</code></a> (passport) - passport: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/baf69da9f8b9e1858fa89418e12f3133ab567d88"><code>baf69da</code></a> (passport) - passport: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/fcd45dd063da8338c812d5d8af9c41c6d4405826"><code>fcd45dd</code></a> (passport) - passport: add cluster migrate</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/da6d32a3f09d43209fd1037cb1cff810ddcdcf68"><code>da6d32a</code></a> (prometheus) - prometheus: add prometheus-config</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/683de9e2c03941152196e4fb986cb9ce8e7c1a0f"><code>683de9e</code></a> (prometheus) - prometheus: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/3323300fa23d53bc09e3e70041f4a300aaace68b"><code>3323300</code></a> (prometheus) - prometheus: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/da1d356e3f978a01fcbbd6b5996ff9272748ed87"><code>da1d356</code></a> (prometheus) - prometheus: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/4e7a936edaf8446d48b80e69afd610af6d59a6a4"><code>4e7a936</code></a> (prometheus) - prometheus: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/44c1c6f6a3a11cd1792753c7ba94faf6675e8fa3"><code>44c1c6f</code></a> (prometheus) - prometheus: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/d1f1dda09da1cd0b82dd18854e196b206e27e931"><code>d1f1dda</code></a> (prometheus) - prometheus: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/0836fc1cea544fd928fb6727c99ca9369a1c2134"><code>0836fc1</code></a> (prometheus) - prometheus: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/9e132322c6c36fde1a6ce4f8fabce6ffdb73cb32"><code>9e13232</code></a> (prometheus) - prometheus: add LICENSE</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/f53e14a9e741122cef2a88976a4ccafc6ad6f6fd"><code>f53e14a</code></a> (rabbitmq) - rabbitmq: remove auto user</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/0ec7277c5624b35ea1ac9d5d88a9eddb75278794"><code>0ec7277</code></a> (rabbitmq) - rabbitmq: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/f376a30bdb6223f03b7d3e40eb3093616830291b"><code>f376a30</code></a> (rabbitmq) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/51405d8f429584fcf5d38a7b1422971304f3981c"><code>51405d8</code></a> (rabbitmq) - rabbitmq: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/463ca03544a31a0a6c98ceb4862e9cd15a47271b"><code>463ca03</code></a> (rabbitmq) - rabbitmq: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/1978a714c0f868de9d4dfc863be003c313d3db6f"><code>1978a71</code></a> (rabbitmq) - rabbitmq: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/139277f11035e0e548bfdc35272579806cd8bb0c"><code>139277f</code></a> (rabbitmq) - rabbitmq: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/be49741721134fd966c09ea44ef87b705668c8a2"><code>be49741</code></a> (rabbitmq) - rabbitmq: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/6d22518f5bbb3883bc4bdc05b6c93ea6b40e3be9"><code>6d22518</code></a> (rabbitmq) - rabbitmq: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/0eb7833ac8a01bbde78f3e0172e6d3d2948d6234"><code>0eb7833</code></a> (rabbitmq) - rabbitmq: add check shards</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/921106312dc679e79c8dc8ce226ae62fa68ce0ec"><code>9211063</code></a> (rabbitmq) - rabbitmq: erlang vm tuning optimization</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/648a78d9b886890e924250a198624972d28a2ad8"><code>648a78d</code></a> (rabbitmq) - rabbitmq: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/0b43a4d04556eb2bfa81cc8ed22d84d636ad45d1"><code>0b43a4d</code></a> (rabbitmq) - rabbitmq: add x-random exchange</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/ad1c4da3f11a1e690508c71a992a3bda86b56201"><code>ad1c4da</code></a> (redis) - redis: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/3f37f92a06db4b06c105718bec48aeaac2bf1a31"><code>3f37f92</code></a> (redis) - redis: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/e3bef7a15e73fb77ba76ac4f0140fa03ebd2a813"><code>e3bef7a</code></a> (redis) - redis: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/4e806d40f4a203db5c91dd184a712fba8ce55820"><code>4e806d4</code></a> (redis) - redis: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/d5023be85937f1f4cf4b625fb8250a63c4776f3b"><code>d5023be</code></a> (redis) - redis: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/98f5d6fa30d4fb28c89eb547a0e2631aa34a46ac"><code>98f5d6f</code></a> (redis) - redis: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/063f29e85bc565c29d19b900b96017161263cb88"><code>063f29e</code></a> (registry) - registry: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/17bf8ae8cc1a257ff978a6a8ee27d8988f3ed9c2"><code>17bf8ae</code></a> (registry) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7bbad151b1d5c934f9d81a882ea6ebef16bf1723"><code>7bbad15</code></a> (registry) - registry: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/279154fdec97b5e0d28a5c27481928d433ac1369"><code>279154f</code></a> (registry) - registry: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/3e4ae840d5718521278051122c19b96b9dbf2791"><code>3e4ae84</code></a> (registry) - registry: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/fa322d6c372fd6d622a2054584bbcab934ff67f0"><code>fa322d6</code></a> (registry) - registry: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/6c18fe004f3431a59ecd5c874c3bd77af544c661"><code>6c18fe0</code></a> (registry) - registry: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/0bc8472a7baa4b8f982694b97528fa984c03639d"><code>0bc8472</code></a> (registry) - registry: remove health url</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5dacd9f735816decc4b6af7c4994a75ce280d92b"><code>5dacd9f</code></a> (registry) - registry: add wait-for-port check</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/fdeefc3888d5ec0dbfff8db6c797621a90896531"><code>fdeefc3</code></a> (registry) - registry: use headless</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/08bf9f882de2d94f8c3bdefafe24fafa9b9870c4"><code>08bf9f8</code></a> (registry) - registry: change registry port to 5000</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/40bcea2ddf3a6e6316422e14a25df360fb4dcf81"><code>40bcea2</code></a> (registry) - registry: add registry push test</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/871b8e72735b0c17f4c692ea53495e1abb4497d1"><code>871b8e7</code></a> (registry) - registry: add default env</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7f3b3aceea1cc28475f9cec0a3244f693eaf1e6a"><code>7f3b3ac</code></a> (registry) - registry: bump registry 2.8.3</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/569f15dca6d21c69f3ad3734e6509addf2caf913"><code>569f15d</code></a> (registry-proxy) - registry-proxy: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/cc33caf06d9aa2c4bec7a745aa233f8827695972"><code>cc33caf</code></a> (registry-proxy) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/0002aab36b2692250f8653db3505a0300275bea3"><code>0002aab</code></a> (registry-proxy) - registry-proxy: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/40af10ba90e5e0e6e050f5d97625a1294ab6f910"><code>40af10b</code></a> (registry-proxy) - registry-proxy: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/c56b9dff701130403d9d0ecc932069fa16d2e462"><code>c56b9df</code></a> (registry-proxy) - registry-proxy: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/9d5bfe091bddf0f6d7d0cd8995823540b084dc77"><code>9d5bfe0</code></a> (registry-proxy) - registry-proxy: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/e6a33500e5eba9a32baa3f2e9841e67546236965"><code>e6a3350</code></a> (registry-proxy) - registry-proxy: change worker_processes to 1</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/726f39d51f196a28effb917fbacb20db960cf5f3"><code>726f39d</code></a> (storage) - storage: add volume compactionMBps</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/a5aa2d87bd4d320e30833cbe3e3598f5199e7da5"><code>a5aa2d8</code></a> (storage) - storage: add threshold to vacuum and reclaim spaces</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/e687d044f2796dbfef23239df62337b2e658b797"><code>e687d04</code></a> (storage) - storage: delete disk type in single disk case</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/75ee2e4f4acfa1c4fd8f725252ffdc8a30495dda"><code>75ee2e4</code></a> (storage) - storage: change datanode replicas to 4</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/c5fd7bad70e239cd389fc92372305435e099d4ce"><code>c5fd7ba</code></a> (storage) - storage: delete useless env</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/b3826ea800b1fbde96178f590d25361560f3bc3a"><code>b3826ea</code></a> (storage) - storage: add ssd hdd dir</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/29881a0702b1e68e69c86e6ae96da8c4eda209a4"><code>29881a0</code></a> (storage) - storage: add balance cronjob</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/c5a0f512283eb2c32814f3b2f3c0e3ebfb57bd1f"><code>c5a0f51</code></a> (storage) - storage: add defaultReplication for seaweedfs master</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/543c7a273c2988d477782ba97462263c93068669"><code>543c7a2</code></a> (timeseries) - timeseries: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/5376024ea1489cf311fd18dd691ab5b80eb4e5e8"><code>5376024</code></a> (timeseries) - timeseries: update timeseries-service-replica</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/52e8520d0e2bb6b0625304a8e29d3b680bc44840"><code>52e8520</code></a> (timeseries) - timeseries: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/f82657ceb0cdf390fb07e721ce57e07081d43968"><code>f82657c</code></a> (timeseries) - timeseries: add start script</li> +</ul> + + + + + + Blog: Drycc Workflow v1.6.0 + /blog/2022/10/21/drycc-workflow-v1.6.0/ + Fri, 21 Oct 2022 00:00:00 +0000 + + /blog/2022/10/21/drycc-workflow-v1.6.0/ + + + + <p>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.</p> +<h2 id="workflow--v150---v160">Workflow ## v1.5.0 -&gt; v1.6.0<a class="td-heading-self-link" href="#workflow--v150---v160" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.3.0 -&gt; v1.4.0</li> +<li>controller v1.4.0 -&gt; v1.5.0</li> +<li>passport v1.0.0 -&gt; v1.1.0</li> +<li>database v1.1.0 -&gt; v1.2.0</li> +<li>imagebuilder v1.0.1 -&gt; v1.1.0</li> +<li>fluentd v1.2.0 -&gt; v1.3.0</li> +<li>logger v1.2.0 -&gt; v1.3.0</li> +<li>storage v1.2.0 -&gt; v1.3.0</li> +<li>monitor v1.2.0 -&gt; v1.3.0</li> +<li>redis v1.2.0 -&gt; v1.3.0</li> +<li>influxdb v1.1.0 -&gt; v1.2.0</li> +<li>rabbitmq v1.0.0 -&gt; v1.1.0</li> +<li>registry v1.1.0 -&gt; v1.2.0</li> +<li>registry-proxy v1.1.0 -&gt; v1.2.0</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/52517d9323bfcd246e1fd8e13bdee2c45739136a"><code>52517d9</code></a> (builder) - builder: update controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1d78ca01de03c80ac86687999d82dba0077df31a"><code>1d78ca0</code></a> (builder) - builder: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/26b69801c78321da8754c814b6503ec76e857a1b"><code>26b6980</code></a> (builder) - builder: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bfd43851009116d6d4bceb4c46edc3cd21cf9d41"><code>bfd4385</code></a> (controller) - controller: add get manager user status</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/874208d8501198ed8780f2e820ab112d3b78eae2"><code>874208d</code></a> (controller) - controller: unified measurement model</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/cadf98f888c384890c529700c16208b17e17dff2"><code>cadf98f</code></a> (controller) - controller: add admission webhook</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e0050c23869dd3a1d5e8038859a7324484b227b2"><code>e0050c2</code></a> (controller) - controller: new measurement model</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a11ba587b73058c3af610fc9fc101e5d446eb43f"><code>a11ba58</code></a> (controller) - controller: multi pod restart uses async</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/fb3c15d70041d4b215c34b5625cb82ae52279d2b"><code>fb3c15d</code></a> (controller) - controller: add check app owner status</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d78b764c874c30f23aa7e6db9a0d03cb09b6a24"><code>3d78b76</code></a> (controller) - controller: add resource services api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d6a2012ab840dcde1be3c8f197df76eac9c5d88"><code>3d6a201</code></a> (controller) - controller: add search apps api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/01c443a3bf142d6497d20492e3ee7f534db64322"><code>01c443a</code></a> (controller) - controller: add KUBERNETES_CPU_MEMORY_RATIO parameter</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7c2623276991b46b7ac2b8e9d8ce2f84e8ebf26b"><code>7c26232</code></a> (controller) - controller: add volume size limit</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3bee749fc0c670d3ee371c7ffb031f47f0d45873"><code>3bee749</code></a> (controller) - controller: add annotations support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/23cd97c1f213ea9dcec45a4a40e9c3942904e55a"><code>23cd97c</code></a> (controller) - controller: traefik v2 support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e37b7db45049776d7d7455e01f5928986b24b043"><code>e37b7db</code></a> (controller) - controller: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b3b367b108bea56a5fa5ccc603f0dafc14bb5edb"><code>b3b367b</code></a> (controller) - controller: add volume expand support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a4e154aaf0f6cd3b01ebbab0a4af1a4b693a45a4"><code>a4e154a</code></a> (controller) - controller: add database replica support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2f37216fbaed5fa707c76b44881b1f7507a75f49"><code>2f37216</code></a> (controller) - controller: switch wsgi to asgi</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b3314a50607e9d5383d0ce954811827acae8fa05"><code>b3314a5</code></a> (controller) - controller: add pod exec api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/75df2dce65591da4e1e56c7f56a1903749fa4e20"><code>75df2dc</code></a> (controller) - controller: add stream support for app logs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4229badbcd4e367cbe13bf13f2b5c62271b7b31e"><code>4229bad</code></a> (controller) - ccontroller: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/89bb19b20f2eb0d8918cdc7223fa3b117af620d5"><code>89bb19b</code></a> (database) - database: upgrade to pg14</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9f45a5d5e9b7871c47acd73ce227856c1683f6a2"><code>9f45a5d</code></a> (database) - database: add hugepages support</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/c4008c9fbe0f99d1200a58466a15466d92840fa5"><code>c4008c9</code></a> (database) - database: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/411a7b269a3333caed809a1afac69578a7c5ad9b"><code>411a7b2</code></a> (database) - postgres: use patroni</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/64e5cb0aaaacfa2d9976e278583fa700c858ce92"><code>64e5cb0</code></a> (database) - database: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/2bab823194abea35c7a1ff4d59db6a88eb19fcad"><code>2bab823</code></a> (fluentd) - fluentd: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/337ba62d587a4f6c7321aa6ef843d5764692a09e"><code>337ba62</code></a> (imagebuilder) - imagebuilder: run podman as rootless</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/4396ffaeb6a2751e6f78907ac7c517966b5e3c08"><code>4396ffa</code></a> (imagebuilder) - imagebuilder: switch to oci charts</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/f37ae0927023685d88f9e594d8316d8c40cd5296"><code>f37ae09</code></a> (influxdb) - influxdb: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/04503b2c0d5c455c1a106c71be727d2b2b14a2f8"><code>04503b2</code></a> (influxdb) - influxdb: add influxdb ha</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/41ddad5e9acb54fa5bb2c35559615d1cc4fd3af5"><code>41ddad5</code></a> (influxdb) - influxdb: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2006480f82ab4291efa75a69cad0080a29872110"><code>2006480</code></a> (logger) - logger: use redis stream replace nsqd</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/ab23d17f378ea1b740fb4c43dc06f4853d5c729f"><code>ab23d17</code></a> (logger) - logger: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/81d4e9dcde820ab8dc1df6fb99f82fdf39eb35ea"><code>81d4e9d</code></a> (logger) - logger: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c3d9796e21c344d660bfd036d6154c28a3051995"><code>c3d9796</code></a> (monitor) - monitor: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/cd9de3c70c33236975b1d2547b75a66649fba93d"><code>cd9de3c</code></a> (monitor) - monitor: switch to oci charts</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/318a73f7f03c01faa23ce3a89b4b52d5cae4279d"><code>318a73f</code></a> (passport) - passport: add change user confirm</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/79ef1004687152d93a5e60058fd4f40a6273b55a"><code>79ef100</code></a> (passport) - passport: add re login at authorize</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/6927bb5884a7ee332a64afabfd6439467d7fee3c"><code>6927bb5</code></a> (passport) - passport: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3146a0981b744962d68a75fab65e074ab61d4b1c"><code>3146a09</code></a> (passport) - passport: add google reCAPTCHA</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/802abcdd5f0768d75b4fc9f08f46c4b2a590be29"><code>802abcd</code></a> (passport) - passport: add replica database support</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/a0dcd1b7b2bdd3ba247d50fdf554a2918b065588"><code>a0dcd1b</code></a> (passport) - passport: switch wsgi to asgi</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/4c9dbba2b1e79cf9860e19529bd99f52f5588328"><code>4c9dbba</code></a> (passport) - passport: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/74825f7827e22b75938cbcc5bf81ad1a40c4ab37"><code>74825f7</code></a> (rabbitmq) - rabbitmq: add rabbitmq managentment ingress</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/12cf7d60e4e89e3396e786f4487cca55f1322887"><code>12cf7d6</code></a> (rabbitmq) - rabbitmq: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/103417de373246b4f1e0b9cdaf2eaae6ba704dea"><code>103417d</code></a> (rabbitmq) - rabbitmq: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/5d428bbd55c0ec12f6fcafe312b2cd3768fb51d1"><code>5d428bb</code></a> (redis) - redis: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/a88c1a9625757b901515682f39d40a7f5b877f95"><code>a88c1a9</code></a> (redis) - redis: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/541585d4060d6006b99fd3649718566a6ea3163b"><code>541585d</code></a> (registry) - registry: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/e9ca9d475dade575ae13c3b288148b8094faf3f6"><code>e9ca9d4</code></a> (registry) - registry: add garbage-collect cronjob</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ec62a5969747738252132510923637c1b63b63d8"><code>ec62a59</code></a> (registry) - registry: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/fde0b07f243deabc0818efc4088583c6ca6aa5b8"><code>fde0b07</code></a> (registry-proxy) - registry-proxy: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/be14eb42fcda99f9160d21f437858e89337543a2"><code>be14eb4</code></a> (storage) - minio: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/51af6966183c496c9c1374cf4c4fa9b66f319a44"><code>51af696</code></a> (storage) - storage: add k8s csi support</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/76a75d922b965b8961f872b62c67569924e0cf49"><code>76a75d9</code></a> (storage) - storage: add cluster health checker</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/a17dc8cc37c2c2d96acdbcc08a6c2e52676cb777"><code>a17dc8c</code></a> (storage) - storage: switch charts to oci</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e4f44fba4f4a71812b0a1b0d42668d8a6f3bbc65"><code>e4f44fb</code></a> (builder) - builder: no error return</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e38dfc71c5dfa0edafc5603f274235048a3992d7"><code>e38dfc7</code></a> (builder) - builderControllerHost/ControllerPort init error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ff9069fee85633db4801a43d4fa70292099c94dc"><code>ff9069f</code></a> (controller) - controller: influxdb query error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f7f5069569e3f7325fc8fa5f90f8c19e95c0c6ce"><code>f7f5069</code></a> (controller) - controller: authentication 500</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7e297a8996c9fbf490fcbce364c0b4172bdc6388"><code>7e297a8</code></a> (controller) - controller: add check remote user status</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9db28e1ea4627f8f63dcc6f83db2962dc5b47451"><code>9db28e1</code></a> (controller) - controller: celery MaxRetriesExceededError</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4bcff08d38a01a4d7267fef00650395275e3203b"><code>4bcff08</code></a> (controller) - controller: wrong name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d69fde2efc71b015ae2894fcc3efa0cf369457e5"><code>d69fde2</code></a> (controller) - controller: traefik ingress create error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a3ad743c2ecd0528c5c69915272dc68a90fd841a"><code>a3ad743</code></a> (controller) - fixup(controller: user login error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/662c8ddfbcb03d19f5ced769de21964ff5ed413e"><code>662c8dd</code></a> (controller) - controller: change influxdb port</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/957bdf67128b45abad43e8ee560fb6cb749b0783"><code>957bdf6</code></a> (controller) - controller: validate rsa key pairing before storage</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/419ec4c4de6ad77c9cc3f551260fdc35504ceb15"><code>419ec4c</code></a> (controller) - controller: kubernetes pod/exec cluster role</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a67edaae26c00a7ce806bde95b73041ec1c84734"><code>a67edaa</code></a> (controller) - controller: Cannot routing:disable</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e09e2144f1906b19d9b00f0883effe3491198ebf"><code>e09e214</code></a> (controller) - controller: allowlist cannot remove</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/318b1267f35bcf158fc21b20f8e367a3e23fa454"><code>318b126</code></a> (controller) - controller: domains update error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/92855ebc7df34fb8cc5ea440db4f821681ae2408"><code>92855eb</code></a> (database) - database: premission denied</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/bde945ab972d9085009b291c0faac55d8942b014"><code>bde945a</code></a> (database) - fixup(postgres: support arm, fix Failed to build psutil</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/7854d45a2164a1db8ee37bc3ce39c8515bacae30"><code>7854d45</code></a> (database) - fixup(postgres: user name converted to lowercase letters</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/57b2a0708d5ab8fff913e97be09f132074d1ff56"><code>57b2a07</code></a> (fluentd) - fluentd: ifconfig_path not found</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/20e72b962a415773fd97919832c7a0bde9c55a28"><code>20e72b9</code></a> (imagebuilder) - imagebuilder: upgrade pack version</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/651db8a1d2f40f0fafb88f2da4b6fd20ee920715"><code>651db8a</code></a> (imagebuilder) - imagebuilder: chown uid gid order</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/d2e9164afe61fac362beb65ee9113453c2ecd970"><code>d2e9164</code></a> (influxdb) - influxdb: proxy not running</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/3a1d3618d881880abcd752c9c9184a570b38442e"><code>3a1d361</code></a> (monitor) - monitor: charts naming</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/d754ae0244e6e1e300062db24c8e4477b7522715"><code>d754ae0</code></a> (monitor) - monitor: telegraf init error</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/63f9e346a4ded75b7b4f8f0c6708bbe725ee6160"><code>63f9e34</code></a> (monitor) - monitor: affinity error</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/95ae1e5f51e528b75ccae36ad86e9abfbff52050"><code>95ae1e5</code></a> (passport) - passport: yarn build fail</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3f5365e8e5be0b2a486651e87fb5b82fe4668bbc"><code>3f5365e</code></a> (passport) - passport: wrong name</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/907f17b95c1114a802781f2bbec3ba046464f1a8"><code>907f17b</code></a> (passport) - passport: change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/e3911e0f5e9174ab8e7542f60b8bd0c3ff7f85f6"><code>e3911e0</code></a> (passport) - passport: &lsquo;registration_done&rsquo; not found</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2ace5f0a2a363d959a381bd3f759b4990bc13953"><code>2ace5f0</code></a> (passport) - passport: ui style</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/b3ba1e1545f07ee2322850ee6cfb6915ee26967d"><code>b3ba1e1</code></a> (passport) - passport privacy policy link</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/172e9c8b680a83d6c437292febf0418d35c99aa9"><code>172e9c8</code></a> (passport) - passport: check databaseReplicaUrl error</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/a3aeb7052d4ebdbc7bd020850f94921c253a8a38"><code>a3aeb70</code></a> (rabbitmq) - passport: change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/5c73dcf6a8692e83abd40f1d5e991714b3c51876"><code>5c73dcf</code></a> (redis) - reids: DRYCC_REGISTY misspelling</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/d7e3baf4600d87e4d4af2b3e581cb62c591a25b6"><code>d7e3baf</code></a> (redis) - redis: env miss</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/cadaa9151519a4efb52d5c5f779cc0aff0f8fe1e"><code>cadaa91</code></a> (registry) - registry: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/d524217dccfc6dd80c86547d5f2f875b15a8054d"><code>d524217</code></a> (registry) - registry: storage run error</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/854f912bf746ac69d0117378888c1fe8334dd7fb"><code>854f912</code></a> (registry) - registry: chown uid gid order</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/e642bb7452fb62bbc7ce6f1b852e029b88a71488"><code>e642bb7</code></a> (registry-proxy) - registry-proxy: containerPort error</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/8dfd029b78d2dcd1b6bf31960d35234deb6bfc5b"><code>8dfd029</code></a> (registry-proxy) - registry-proxy: chown uid gid order</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/bbea3642114ac83e3c9cb56e7131146378bbf213"><code>bbea364</code></a> (storage) - minio: premission denied</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/97deba16553dd6dc8d2625d8747825692e8667bb"><code>97deba1</code></a> (storage) - storage: node unimplemented error</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/b9bdeff3ef47f43ec12dd16194297d63298fbd34"><code>b9bdeff</code></a> (storage) - storage: pd can not connect each other</li> +</ul> +<h4 id="style">Style<a class="td-heading-self-link" href="#style" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1edb10c23e5ae5654e6a7daf08b7a74fe9c86b74"><code>1edb10c</code></a> (controller) - controller: database convention over configuration</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1960cc3367aa6b0e8f0db5f0117a271c884356a0"><code>1960cc3</code></a> (database) - database: database name convention over configuration</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/06d1f5dd3b7ff353ae26615695732f54dd09e5c7"><code>06d1f5d</code></a> (imagebuilder) - imagebuilder: URL to Url</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/b8a89412e7794fe9e16689d4e8902d34f68a6ce1"><code>b8a8941</code></a> (passport) - passport: database convention over configuration</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8e9a199ac90382e67f64c757d9d207e7aa106c86"><code>8e9a199</code></a> (builder) - builder: upgrade controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/48401512b2eee6a608efe45c962809a4a388ed9a"><code>4840151</code></a> (builder) - builder: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/68ccfb12da3fdc35519b23fdb8212f7de377f8b5"><code>68ccfb1</code></a> (builder) - builder: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8f971cbd509062f952e0b0fe2fdc9983891077ad"><code>8f971cb</code></a> (builder) - builder: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fe2c55d0e5264818e482fcd71510d9a616689c79"><code>fe2c55d</code></a> (builder) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2b5e70609f11eff1eb1e1d8a5591644799fa8982"><code>2b5e706</code></a> (builder) - dockerfile: change user and workdir</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7a6c8d319bcc67e1cbe5a733de773860aa859765"><code>7a6c8d3</code></a> (builder) - builder: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fe494f75669f9e3a51ff32e330edb8c5a33efed7"><code>fe494f7</code></a> (builder) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/a7c87525709c6903e4fb254740eac710c3e18385"><code>a7c8752</code></a> (builder) - builder: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/eb2e94c2ab4358e74a74c8d198eb6798e9bdeae7"><code>eb2e94c</code></a> (builder) - database: bump mc 2022.04.01.23.44.48</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/cfaae66aa31b4b7b28c7d4577e9bf9c7f17a6716"><code>cfaae66</code></a> (builder) - builder: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d7d289060ddafcc94855bb46dc4fbc24cf1c3527"><code>d7d2890</code></a> (builder) - builder: change default imagebuilder registry</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ecfdb19270198fc3f2b46cc0dc91151bd3ebf114"><code>ecfdb19</code></a> (builder) - imagebuilder: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/6da17f489543950af850ee3d5bb4e1cfbcc5cac1"><code>6da17f4</code></a> (builder) - builder: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1a57e5bd5e467b859e0d69e6b3775454132cb225"><code>1a57e5b</code></a> (builder) - builder: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f1464fa6065483d23b98f01a847b73e951f896ae"><code>f1464fa</code></a> (builder) - builder: <a href="https://github.com/minio/minio/issues/13799">https://github.com/minio/minio/issues/13799</a></li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/b1e1c4f5920ba82235a253f9980960ef9dca527d"><code>b1e1c4f</code></a> (builder) - builder: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/71a41453660c6d731247a10e00f94121ae3a69a5"><code>71a4145</code></a> (builder) - builder: bump go.mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/3567688f8809e3805e47170d4b3109a31b1f883f"><code>3567688</code></a> (builder) - builder: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/73ea38b11c631415aa02c5ee43ff92ecfe48348d"><code>73ea38b</code></a> (builder) - builder: change storage to minio</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1f913215ba18670fe83891bf84317b72985151dc"><code>1f91321</code></a> (builder) - builder: use testify replace assert</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d148b9c998759b886ea5493d0e2aa94518d39dcb"><code>d148b9c</code></a> (builder) - builder: add check storage health</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/b768101f69233fa792f3240be47b71b24881e90c"><code>b768101</code></a> (builder) - builder: change initContainers</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1b3bec3ea2783c5124f372c2874c3691b71489cd"><code>1b3bec3</code></a> (builder) - builder: add replicas</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5cb0d618ff5bb1136501f4ba6359e5e5c46a7a63"><code>5cb0d61</code></a> (builder) - builder: upgrade to latest controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/98b9d581209eacabdb9e28c5eb6a7975f13bd454"><code>98b9d58</code></a> (builder) - builder: upgrade new require</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/65817c3e519df8368cd4427f5d366f9edde1fbd5"><code>65817c3</code></a> (builder) - builder: change drycc.cc to <a href="https://www.drycc.cc">www.drycc.cc</a></li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4e3f9d05bb8d00023e6f1927785b7c27d4801652"><code>4e3f9d0</code></a> (controller) - controller: add celery retry mechanism</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f6716fee7625ad8f0cad2b1cf5ad746beb847a65"><code>f6716fe</code></a> (controller) - controller: change cronjob name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/eb606938533da2673ed2aa2986bcb0cdd2c9ee2c"><code>eb60693</code></a> (controller) - controller: refine celery task priority</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/66905e95bb3c9f71fb4c75038199d54c6b5a0edc"><code>66905e9</code></a> (controller) - controller: change manager auth</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ea20c415af0ee4e70f32873748cd979bd36f8240"><code>ea20c41</code></a> (controller) - controller: remove start/stop api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4c8fc807f950064d2cc98ebdd6a51ec86eabb20f"><code>4c8fc80</code></a> (controller) - controller: improve tasks error handling</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/cf7402eaff8373c956e6c0ffa1c7ff479cade8e2"><code>cf7402e</code></a> (controller) - controller: add blocklist api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/80f14dd5b8852c235e3de496261b416c8b59a043"><code>80f14dd</code></a> (controller) - controller: use get_user_model replace auth.User</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ffc7bb790f2257f5e5f9902400f78524d1f528e3"><code>ffc7bb7</code></a> (controller) - controller: use JSONField replace ArrayField</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/370df8c9d011e25785a06e5a4a737dcdb622f4f5"><code>370df8c</code></a> (controller) - controller: add validate metric</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/29084ce759bddd671de4441c6f8e6889774e4c80"><code>29084ce</code></a> (controller) - controller: use user id request manager api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/718fe123eafe5136ac08635c8cf1dbca3dcad4ab"><code>718fe12</code></a> (controller) - controller change urlpatterns order</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/71f40426a65bc6cdc90e6185b1487ae30a3c73de"><code>71f4042</code></a> (controller) - controller: measurements uses lowercase letters</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e5123ea55ae516d94b0cb54ec6ffb464c050ce87"><code>e5123ea</code></a> (controller) - controller: change resource unit to number</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/18fee9aeb1114ea8dbcc4d8eacea93148206e002"><code>18fee9a</code></a> (controller) - deps: bump celery from 5.1.2 to 5.2.2 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ffca6c11c67012e13540e06c12cf30dea5e5cde7"><code>ffca6c1</code></a> (controller) - controller: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9ec12e1ff7bcfb3b72953313484d3f605d97c73b"><code>9ec12e1</code></a> (controller) - controller: simplify drone configuration</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4b4749e2fd391a492fbf40fb7ee25c7b61b52f26"><code>4b4749e</code></a> (controller) - controller: set default CSRF_COOKIE_SECURE false</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2ef6338c20c8625b2cc76c6021149bc07141fcd0"><code>2ef6338</code></a> (controller) - deps: bump django from 3.2.5 to 3.2.10 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c7570d0a40f7daa04de0a4fe1ecbb001e436ee41"><code>c7570d0</code></a> (controller) - deps: bump django from 3.2.10 to 3.2.11 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8b17bc16624fd9caddbbc462cc3487d3500a5216"><code>8b17bc1</code></a> (controller) - controller: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c928fb09f88ce210df7b495b80a005146320e2bf"><code>c928fb0</code></a> (controller) - controller: use rabbitmq cluster</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f9171852a8530c9bd385576517d24172917a1b33"><code>f917185</code></a> (controller) - controller: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/22a8f634a3574553132ecd53e8be467d84a255e9"><code>22a8f63</code></a> (controller) - deps: bump django from 3.2.11 to 3.2.12 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3cc3b00a705b9c7b0ff5d36fb2c0ab4139113dd9"><code>3cc3b00</code></a> (controller) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ee274f6d6728b3b9b3fd91b344be3f8a0d3f737f"><code>ee274f6</code></a> (controller) - controller: set venv profile</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ce6b069644ed3952a47bdd1bd728a395a9f1af05"><code>ce6b069</code></a> (controller) - controller: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3a105d3628e40e2f53dfd2badeb7221555207227"><code>3a105d3</code></a> (controller) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/15f9b0ea96630a818ec191dac15497a5dc99cadc"><code>15f9b0e</code></a> (controller) - controller: code review</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/01e6fd9ef5d730749a33986ff9d58dd854f50cb5"><code>01e6fd9</code></a> (controller) - controller: use passport user id</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/893ee31a1de6036136d0b813d5ff6575267e640a"><code>893ee31</code></a> (controller) - oauth2: update user info pipline</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3028fb470f23d858a5e36312e419dcdfbcc00be0"><code>3028fb4</code></a> (controller) - user: set AnonymousUser username</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5daf82d3bd17f2c653d2db52fb79d2a895ed1335"><code>5daf82d</code></a> (controller) - controller: set worker_cancel_long_running_tasks_on_connection_loss</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/61f2c53a7841099e33c8d5f8d25de311392ce317"><code>61f2c53</code></a> (controller) - controller: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/88feb1df0f3508c29a47ea291f225207a8a4c754"><code>88feb1d</code></a> (controller) - imagebuilder: python=3.10.4 rabbitmq=3.9.14</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/914e03fb8d6d6bff7ef9b5f91b0a3eeedac2ebeb"><code>914e03f</code></a> (controller) - controller: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a5bb548ee73cd201cafe797fdba4fe89e4bbb377"><code>a5bb548</code></a> (controller) - controller: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3ecdd7c05b7cddd640ffe92012b777a80cae1eec"><code>3ecdd7c</code></a> (controller) - controller: add a separate rabbitmqUrl configuration</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/967cb116bdbbf040c3c3c15579bb2d334666d3e8"><code>967cb11</code></a> (controller) - controller: remove APP_STORAGE</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/473d2b5f08c205240b5e081fcb9256d7ecd4cd45"><code>473d2b5</code></a> (controller) - controller: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e410d4cba17662bad797fbd7288052b81e50df29"><code>e410d4c</code></a> (controller) - deps: bump django from 3.2.12 to 3.2.13 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c6ef777035d5e955984f9f4c84fac465943d8b74"><code>c6ef777</code></a> (controller) - controller: simplified passport config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0fd3233f1471b32c621149ac4ca5b5527741fda8"><code>0fd3233</code></a> (controller) - controller: remove settings hardcode</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a64e99cf099eba92c6df749c3c89f4245488b3e4"><code>a64e99c</code></a> (controller) - controller: change passport config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/62aba2594f1240c4368d95c61d75fa08343d05fb"><code>62aba25</code></a> (controller) - controller: set cronjob timezone to utc</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/760b70b635d6eecedfd3d40991740b13e587c1c5"><code>760b70b</code></a> (controller) - controller: change default ratio</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8dffc3afbce3871dc82fe4ce94c92b1fbbacc9b6"><code>8dffc3a</code></a> (controller) - controller: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/26043c40c89cb162b3ce322eba6a79f81a6b24cf"><code>26043c4</code></a> (controller) - controller: change default app storage</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/608bd8da7a7cb75d8fadfa965bcd9ea32e4a96ef"><code>608bd8d</code></a> (controller) - deps: bump django from 3.2.13 to 3.2.14 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/18ed0c2a656497108f98c5c8dbd3b27253dd7915"><code>18ed0c2</code></a> (controller) - controller: remove conjob affinity</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/add671288d5f4af68735a69771f024e4ed856196"><code>add6712</code></a> (controller) - controller: add volume expand support use patch</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/cc1ad1322ba638aa7f6acf45823047712a85e86f"><code>cc1ad13</code></a> (controller) - controller: add startupProbe</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0e9a6033b1a2b66f937010601df70e5625674a66"><code>0e9a603</code></a> (controller) - controller: add clearsocial cronjob</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/eb6f05d969102c008051ebd4c7e39a1300ed1b25"><code>eb6f05d</code></a> (controller) - controller: change initContainers</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/762c6767947b6407a7fb23ffbcb07dc46154b222"><code>762c676</code></a> (controller) - controller: change replicas</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/abd7e8c2210eb1f71c1d280383794af5fa786c98"><code>abd7e8c</code></a> (controller) - deps: bump django from 3.2.14 to 3.2.15 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/07fdf1b9938d868ef55c1d2067258a1eb6c59d23"><code>07fdf1b</code></a> (controller) - controller: remove database conn_max_age</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ef8e41f523aa0159831c95623b96fa74b3570d0c"><code>ef8e41f</code></a> (controller) - controller: add database replica check</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/79143f2301bfc52f8181fc0e0f07263645e065d8"><code>79143f2</code></a> (controller) - controller: upgrade new require</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a62404890973cb26c9360878e7625e15eb87d281"><code>a624048</code></a> (controller) - controller: add app.refresh func annotation</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b22d367d54aa2ab131c8e69491e084dc283826a4"><code>b22d367</code></a> (controller) - controller: optimize app refresh timing</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/fe98f0c8f3d2cfebc2b6ad13927627ebee96e39e"><code>fe98f0c</code></a> (database) - database: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/5e00c118e5830c43158417486b83602d1e9839ff"><code>5e00c11</code></a> (database) - database: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/d2cb8607a95e098fe0c50a82ebadd3393a52cd56"><code>d2cb860</code></a> (database) - database: disable huge_pages</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/197d80d95e42443351abbf1aae216d5f80073334"><code>197d80d</code></a> (database) - database: add persistence</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1c3e64596ee5970c3ef7a1daeee86ced68ae3ec1"><code>1c3e645</code></a> (database) - database: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/37730ab6ca7ac86728f9fe0f1c41240402abb9bc"><code>37730ab</code></a> (database) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/5014112dd279d1e3a8d5b6fa23797d0996fb2047"><code>5014112</code></a> (database) - dockerfile: change entrypoint</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/29b538e8b33cd19bb3a781abb8335905fa7a533f"><code>29b538e</code></a> (database) - database: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/c2bb0746172d4dc764cd8543d98bb6cbd9205cf9"><code>c2bb074</code></a> (database) - database: bump python 3.10.4 and mc 2022.04.01.23.44.48</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/077a4e95b2ee3d772e030971218e880f31a55e4c"><code>077a4e9</code></a> (database) - database: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/560bdb97a46897ae0fd464ca6e2b54d129d91b37"><code>560bdb9</code></a> (database) - database: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1e54b554f4a29df49ac42ba046f00f71a105f84e"><code>1e54b55</code></a> (database) - database: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/d6466723b4f949a4771d7415f1a80924f398963d"><code>d646672</code></a> (database) - database: <a href="https://github.com/minio/minio/issues/13799">https://github.com/minio/minio/issues/13799</a></li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/a6ac4e350fec8e27c1bdc560130c585d3a7ab7d2"><code>a6ac4e3</code></a> (database) - database: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9618d87f3bc63c8933553278e88c7d6758b9e2af"><code>9618d87</code></a> (database) - database: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/b8232737ff893b064a558821da49b40905b4e83d"><code>b823273</code></a> (database) - database: change minio to storage</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/7bd5a90fe97b9b0ec20f5305431891f10a975c61"><code>7bd5a90</code></a> (database) - database: add check storage health</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/20c6d96e16b2dc7fc7d1bf75a8b44dd6ca459f6f"><code>20c6d96</code></a> (database) - database: fix storage run error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/8bde83071df44a11b01ae13fbe2676567780170b"><code>8bde830</code></a> (database) - database: upgrade to pg 14.5</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a33b5e5ef09bfc8cf5fbf79fd11dee4766a910e2"><code>a33b5e5</code></a> (fluentd) - fluentd: update plugins</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/eed7a7804b91dba5c31762adcf1245950365b4fe"><code>eed7a78</code></a> (fluentd) - fluentd: update filter kubernetes setting</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/cc83dd87809f1b71e18636240582c0a58eb73ad2"><code>cc83dd8</code></a> (fluentd) - fluentd: update elasticsearch store setting and support exclude specific container logs</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/ba2feb28bc7a96ec2a0632c5c4070d5300de3c37"><code>ba2feb2</code></a> (fluentd) - fluentd: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/d528676b75699d731ceba78ca7b207bd1472aed6"><code>d528676</code></a> (fluentd) - fluentd: simplify drone configuration</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/dece82d3a85c2b69d4315d324d03fd1f523e53fa"><code>dece82d</code></a> (fluentd) - fluentd: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/4e0a80244c190607f9e706fdeed0f3829c505a76"><code>4e0a802</code></a> (fluentd) - fluend: replace nsqd with redis</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/15ceca0cdbfb56e03b96cfd96e9b13909667f2e3"><code>15ceca0</code></a> (fluentd) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a7f619f70d0fb77d08f544dc593d033396b984af"><code>a7f619f</code></a> (fluentd) - dockerfile: change workdir</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/9adf5ed9a2387c79a596a4e8fddcc099316e9fd8"><code>9adf5ed</code></a> (fluentd) - database: bump fluentd 1.14.6</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/50c14c28eb1f3c673787b1f59f6b713995cd1441"><code>50c14c2</code></a> (fluentd) - fluentd: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/83171b1e36a4fc787459ffdceb9a2573b518a287"><code>83171b1</code></a> (fluentd) - fluentd: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/ec8358165e029e7c82316877f629b128bb3a00f7"><code>ec83581</code></a> (fluentd) - fluentd: unified reids declaration</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/07c63e24a3760a0604d3c17936690f31380e7b8c"><code>07c63e2</code></a> (fluentd) - fluentd: upgrade fluentd 1.15.2</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/65df9be7b31a93f6ea30d259cb13cf0401d78234"><code>65df9be</code></a> (imagebuilder) - imagebuilder: update pack version</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/66cab351e53388cdb2bddf4f415240883c3217f9"><code>66cab35</code></a> (imagebuilder) - imagebuilder: use dind replace go-dev</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/0c8206098ba01f01039c1b563238a6612e6a1fed"><code>0c82060</code></a> (imagebuilder) - imagebuilder: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/8146da94bfef611398b03c70be316676aa49f626"><code>8146da9</code></a> (imagebuilder) - imagebuilder: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/7d97241d42a0282255d9c1d6a823159671f25fd4"><code>7d97241</code></a> (imagebuilder) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/07e805c48d9f9ccf44e23d91791995f38fa28345"><code>07e805c</code></a> (imagebuilder) - imagebuilder: change default buildpack</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/8d1038df7e714b72d43b491a3fddb36639736937"><code>8d1038d</code></a> (imagebuilder) - imagebuilder: upgrade podman to 4.0.1</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/62d3687a1edeefee68d5fedfb59eea38e791a3f7"><code>62d3687</code></a> (imagebuilder) - imagebuilder: change workdir to /workspace</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/da8bfb0f576bc292eb6427f7945271cc00fcb0ce"><code>da8bfb0</code></a> (imagebuilder) - imagebuilder: change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/d44e3bc2007f4e70c7dfa6d59279e7643345bd46"><code>d44e3bc</code></a> (imagebuilder) - imagebuilder: upgrade stack</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/5b0c7e69839ac408230bc142a2ba42953a068216"><code>5b0c7e6</code></a> (imagebuilder) - imagebuilder: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/f74cbf6113d99064c5b734da329980434c4f854a"><code>f74cbf6</code></a> (imagebuilder) - imagebuilder: add defaultBuildpacksURL</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/941d4939323573679841cc114669e1dec2154f94"><code>941d493</code></a> (imagebuilder) - imagebuilder: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/449be91d0c64e4e7947de68c4e35fcfd8a944a14"><code>449be91</code></a> (imagebuilder) - imagebuilder: <a href="https://github.com/minio/minio/issues/13799">https://github.com/minio/minio/issues/13799</a></li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/63b052341db3e1dcd2458ded7be233ec9877a3bf"><code>63b0523</code></a> (imagebuilder) - imagebuilder: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/4e8a6e570108c8db393c764bd6cfa8f66cb126c7"><code>4e8a6e5</code></a> (imagebuilder) - imagebuilder: add imagebuilder config</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/2d891f53998f135bc91c34ff1e80189e01969ab5"><code>2d891f5</code></a> (imagebuilder) - imagebuilder: change minio to storage</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/addceda27e7416c7e75d7502265448a95377ed4d"><code>addceda</code></a> (imagebuilder) - imagebuilder: upgrade new require</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/a6e569fdfaf379bb7c64c32e2406ecbb61ad890f"><code>a6e569f</code></a> (imagebuilder) - imagebuilder: pack_build add &ndash;env-file parameter</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/6191ff5c4cc132b0a5f9bf4bc227f8a64ed0c327"><code>6191ff5</code></a> (influxdb) - influxdb: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/dc3f8c7ed955953e4b576111edde4f05726a86cb"><code>dc3f8c7</code></a> (influxdb) - influxdb: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/6b5c81922dd498c0abb22e44ff85226881df187f"><code>6b5c819</code></a> (influxdb) - influxdb: new ingress style</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/68b381d1f377bdd805d4db86fb244ece080851bc"><code>68b381d</code></a> (influxdb) - influxdb: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/ea20eb81c27c90d8038872a9b5517ea1a7eafb8f"><code>ea20eb8</code></a> (influxdb) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/64c0a71ef6d0139d8c8df6b8823f53d444df1adf"><code>64c0a71</code></a> (influxdb) - influxdb: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/a709ca19e2ee8a37f9f46263a714aea85e413391"><code>a709ca1</code></a> (influxdb) - influxdb: use DRYCC_UID DRYCC_GID env</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/740dff00afe4b6b207d3e64819745702861e7b8b"><code>740dff0</code></a> (influxdb) - influxdb: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/e0356737f548edc85730aecbbf3ac402ef0fc3a0"><code>e035673</code></a> (influxdb) - influxdb: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/f1cefbd0b3107e5a4a228cce55e580eda0a6e849"><code>f1cefbd</code></a> (influxdb) - influxdb: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/a00100ebf6f1f8ee29d0341689823be68297a9f6"><code>a00100e</code></a> (influxdb) - influxdb: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/9d165ef2cf43f2abceba893a883e34285e694cb3"><code>9d165ef</code></a> (influxdb) - influxdb: add probe</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/bee7fff49a4c9410c5ccae1f3a2435ac0b505e82"><code>bee7fff</code></a> (influxdb) - influxdb: upgrade to influxdb 2.4.0</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/254914c02d7bd968e52586a52b8749d5b3fb6388"><code>254914c</code></a> (logger) - logger: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/8d91c68965c76c955300ec0f2e583020c14465e7"><code>8d91c68</code></a> (logger) - logger: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/b6d21828ed8355c658716f9684c7dee4c73a964f"><code>b6d2182</code></a> (logger) - logger: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/c35e59a79f6ccd9946db9979abb9f5125c899695"><code>c35e59a</code></a> (logger) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a63c07029db0b5f7ec7dc38f4f60489956944475"><code>a63c070</code></a> (logger) - logger: change workdir to /workspace</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a594b28985d601c0289deedef07ac09ccd58a1f4"><code>a594b28</code></a> (logger) - logger: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/9a90e22cac7243e36d88d33f95369a7a5b0a5baf"><code>9a90e22</code></a> (logger) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/36493b41b11e8847d578dd9563d581bf25adcb2e"><code>36493b4</code></a> (logger) - logger: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/897a3a5a77ea96250b76bcf06274179c85549c86"><code>897a3a5</code></a> (logger) - logger: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/03b32ab19cd49ddeb966682fe5e7dd4c3b34235e"><code>03b32ab</code></a> (logger) - logger: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a50ba5fcd9ef8205a1b5064789735241b5ece4b8"><code>a50ba5f</code></a> (logger) - logger: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/23187a3fe6e2ffe2d4fc38a705e72c14a85fbb67"><code>23187a3</code></a> (logger) - logger: unified reids declaration</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/aaa129ade36389917750e10389b3274331caf03a"><code>aaa129a</code></a> (logger) - logger: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/be4f65615f0735303f9be4f9d67158979741b395"><code>be4f656</code></a> (logger) - logger: add replicas</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/7c25459be3cb002ea933a47e9ec318d20d69616b"><code>7c25459</code></a> (logger) - charts: add NetworkPolicy</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6810149b5d3d6199c69909374a72836287f66b9e"><code>6810149</code></a> (logger) - logger: remove memory storage</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a918c50d5294d3ac8bd6d156d0a63ecd373ba72c"><code>a918c50</code></a> (logger) - logger: add .vscode to .gitignore</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a41521029d715d227582cb00edc64953028f5983"><code>a415210</code></a> (logger) - logger: add log follow support</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/59b1da3a3172da80b3b16205a6dc420a79208450"><code>59b1da3</code></a> (logger) - logger: upgrade new require</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/27cc151c73ef774d4799e04431748bdd8ffbeea5"><code>27cc151</code></a> (monitor) - monitor: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/07d6a9dff96571e1445fb04da374935062fa18e0"><code>07d6a9d</code></a> (monitor) - monitor: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/105435759e1f9250aaf0e7c0ea8d5b34aa2e0a76"><code>1054357</code></a> (monitor) - monitor: use redis default port</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e3673dfa93515ecd8507a00b2081ab7749091038"><code>e3673df</code></a> (monitor) - monitor: remove nsqd</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/fc9dd3ed61d7990e451af7b28d7691a6a0557e28"><code>fc9dd3e</code></a> (monitor) - monitor: new ingress style</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/856a898d34a21c18479f11c20926621bcb75894d"><code>856a898</code></a> (monitor) - monitor: add default user env</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9857535c0cdb43253706d3f6d47d15fd0cc592cd"><code>9857535</code></a> (monitor) - monitor: add random user</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/38b5a040f4617782597abd1ed63f2ac732c64bb8"><code>38b5a04</code></a> (monitor) - grafana: oauth auto login</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/5dfc5797cc291d2a6387713989bc0eb5c130127b"><code>5dfc579</code></a> (monitor) - monitor: upgrade version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e121b5a7844ed76b7cca01a89c0cfdbc36438487"><code>e121b5a</code></a> (monitor) - monitor: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/84462a03ead9ebc1addf53ede3089f4abb0db1f0"><code>84462a0</code></a> (monitor) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/b9e8ce8c0775c6ce6725200ca8639b372a91bbe9"><code>b9e8ce8</code></a> (monitor) - monitor: chore(imagebuilder): change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/05ee8abd8e44a731e070c6417b00f9a777649c22"><code>05ee8ab</code></a> (monitor) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e1fa68e170a1b4c8a1fd6ee67d211cb023cb6963"><code>e1fa68e</code></a> (monitor) - monitor: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/b8f302b73ef2f71f53d3c165db6ca0f9d446e294"><code>b8f302b</code></a> (monitor) - monitor: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/4fc991f9be7d47ea1a029d57bbc8c7fb3c80bd5d"><code>4fc991f</code></a> (monitor) - database: bump telegraf 1.22.0 and grafana 8.4.5</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/21a2f6a6b23f23308d50f97ad99b9164919ff5b8"><code>21a2f6a</code></a> (monitor) - monitor: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/acc976f8c3a834f511cb482de03b0e6473de855f"><code>acc976f</code></a> (monitor) - monitor: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/62d76c13d28d136aba544749a837426f3317a794"><code>62d76c1</code></a> (monitor) - monitor: unified reids declaration</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/b3c57ad982406161ef60f04442d4dd9cee91b5b1"><code>b3c57ad</code></a> (monitor) - monitor: optimize oauth2 configuration</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/70af6b07c4c724fbd3070776f4863bffb381d549"><code>70af6b0</code></a> (monitor) - monitor: change passport config</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/69f9a888501b560c698bc6781a80752180f86f04"><code>69f9a88</code></a> (monitor) - monitor: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/2fb278f0ce0d7b9d606b04a4afc297ce44c146f4"><code>2fb278f</code></a> (monitor) - monitor: rename influxdb port</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/17548ffc21f7e10499c535c55ffb413f28576727"><code>17548ff</code></a> (monitor) - grafana: update dashborad</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/69d7bbda0547bae588e01dbcf167d31dfc7debfe"><code>69d7bbd</code></a> (monitor) - grafana: influx dashborad disk size</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/75db1b021bdd974f23f769ae69c9e33aed420d6e"><code>75db1b0</code></a> (monitor) - monitor: upgrade new grafana/telegraf</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/80504a1bb18cfd20493406dccf01e0de1b83713e"><code>80504a1</code></a> (monitor) - grafana: update influx and redis dashboard</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f7078cba8022651a395db8484be72ca8156556dd"><code>f7078cb</code></a> (monitor) - monitor:chown use env</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/91ae0ddb94a172421923af2b63918b051bc65695"><code>91ae0dd</code></a> (passport) - passport: optimize login display</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2d3bbbca40f25656872268f3862f71047f861349"><code>2d3bbbc</code></a> (passport) - passport: change drycc logo</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/59790a747eb6bf83345b57dbd3b27d23b760d48e"><code>59790a7</code></a> (passport) - passport: make user email unique</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/faea034774c19cfac3e5858262600cf1842601ed"><code>faea034</code></a> (passport) - passport: use strtobool</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/1fbf2bc2ce25b003a4f424efeeb67a54408b7744"><code>1fbf2bc</code></a> (passport) - passport: use yarn replace npm</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/119cac8f95d371bc51803dd482d9195460e1ede3"><code>119cac8</code></a> (passport) - passport: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/cff5062a2d8acc931c7a88d3afb7b7b8effd2642"><code>cff5062</code></a> (passport) - passport: set default CSRF_COOKIE_SECURE false</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/9cc021077c3f4f3992727c6661ac758bc8f9e60d"><code>9cc0210</code></a> (passport) - passport: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/9ab38969eff6a8bc8b33166ccd5352b0158e5c17"><code>9ab3896</code></a> (passport) - passport: new ingress style</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/259ccc91b805ed463ff0b0889a58debd78214fc2"><code>259ccc9</code></a> (passport) - passport: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/af1bbcdce7c677597c9647b27e96a1e3fcde7f5e"><code>af1bbcd</code></a> (passport) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/9ae5373f0ce8d6ec3a3f2f2915c9e6b08ca1a025"><code>9ae5373</code></a> (passport) - passport: set venv profile</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/8f610901ad7f5aa175433c2c160076cd0bcc3a15"><code>8f61090</code></a> (passport) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/fcaf72dc9e5f196dc671a8a887ac33dcc4e1b5e2"><code>fcaf72d</code></a> (passport) - passport: upgrade npm package</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/546dcd5b8d668635ada247c7f44d95c0a001bac9"><code>546dcd5</code></a> (passport) - passport: add license</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/4bda2d661883876248c0dd0211fe15551c888c56"><code>4bda2d6</code></a> (passport) - passport: use minify</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/73b0fd135a91bf0e5c6238a659b0e41a5603d179"><code>73b0fd1</code></a> (passport) - passport: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/278fe7a321f4a8561094d0cd8789918a1fd9a5fa"><code>278fe7a</code></a> (passport) - passport: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3cd93d36d49972d4c87fc6fc7cbf38c8b6bd8a1b"><code>3cd93d3</code></a> (passport) - passport: add reactive</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/370b493ccac77e04b1366b4037e9fa7f46d4fda1"><code>370b493</code></a> (passport) - passport: add footer</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/483cbd6ae503b4a3116b673272526a842cd1dcff"><code>483cbd6</code></a> (passport) - passport: use h_captcha replace re_captcha</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3d1675e2af62a5c858b1ae28385af97257c140d8"><code>3d1675e</code></a> (passport) - database: bump python 3.10.4 and node 16.14.2</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/86a783592e559b0a13d2cffcbea6bb4dd7e33684"><code>86a7835</code></a> (passport) - passport: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2d65355b89a12658a69fad874add357378aedf83"><code>2d65355</code></a> (passport) - passport: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/90c1444d2f1f45658fe5a51f406ca58485eb251c"><code>90c1444</code></a> (passport) - passport: unified reids declaration</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2e0e417f1ce86eff2c4d4f35bf5c40e230382cb8"><code>2e0e417</code></a> (passport) - passport: fix firefox footer</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/ad274bed8c36be339d461c657403070abbb695c6"><code>ad274be</code></a> (passport) - passport: use bulecss</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f986d8b3a47d9fd83831fece5000189b1ca82dfc"><code>f986d8b</code></a> (passport) - passport: add main footer</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3e528676fed3aae01fedbc1be39bcab7e997f088"><code>3e52867</code></a> (passport) - passport: dynamic settings for vue</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/38adabc356280f02d3cc048bd00b8ec1be8d91a8"><code>38adabc</code></a> (passport) - passport: change passport config</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f8d6b604a6009be7b04d4b97d3457dcc0ba1b697"><code>f8d6b60</code></a> (passport) - passport: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2cbd79daaeb948f274552e897acd53d0bddefb69"><code>2cbd79d</code></a> (passport) - passport: remove database conn_max_age</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/712279768f9c4dee75e5f0f6f6a1ab0865d5e701"><code>7122797</code></a> (passport) - passport: change drycc.cc to <a href="https://www.drycc.cc">www.drycc.cc</a></li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/8cc84cdb7717cc5a50353f7c32e745725c4c5973"><code>8cc84cd</code></a> (rabbitmq) - rabbitmq: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/f35930fb57b5a0b15c82be2f09879de46bd027e7"><code>f35930f</code></a> (rabbitmq) - rabbitmq: add rabbitmq cluster support</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/fbfa3ba8ff88b80d736ae2dee02575d43754529e"><code>fbfa3ba</code></a> (rabbitmq) - rabbitmq: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/ca607015c53dbf68bcdfe636ff46ce17cb973a01"><code>ca60701</code></a> (rabbitmq) - rabbitmq: use volumeClaimTemplates</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/fe5d1b41f48a729f1ada17ddaec4fd738d2c5c26"><code>fe5d1b4</code></a> (rabbitmq) - rabbitmq: add sharding support</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/9c4ab976e148b46d7fb2ba218254bb4cb8789152"><code>9c4ab97</code></a> (rabbitmq) - rabbitmq: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/348a88a95bad2b93971805ae9563555bfbd4ab00"><code>348a88a</code></a> (rabbitmq) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/2388be18e4d23623cc5b461a31f4dbc13562762f"><code>2388be1</code></a> (rabbitmq) - rabbitmq: upgrade erlang to 24.2.2</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/db2eaa5fac326200594c9768a6e6ce85721a8cea"><code>db2eaa5</code></a> (rabbitmq) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/772afd1f7ed5732355bb9af28018d542d0c6e837"><code>772afd1</code></a> (rabbitmq) - rabbitmq: change to wait pid file</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/2bfc25ec33619c1b10be7639c819c8c2f383bbaf"><code>2bfc25e</code></a> (rabbitmq) - rabbitmq: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/11d505ea19d520d98f74457054dfdbe9e91a98fc"><code>11d505e</code></a> (rabbitmq) - rabbitmq: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/69d63f1c0ce2ed2a0a80945582db041e5dd7bb7e"><code>69d63f1</code></a> (rabbitmq) - database: bump erlang 24.3.3 and rabbitmq 3.9.14</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/838029926101907d9da255e2cbcabc97dd1b0dba"><code>8380299</code></a> (rabbitmq) - rabbitmq: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/b3f69f14a151124887f49a9c4740905221d8f65a"><code>b3f69f1</code></a> (rabbitmq) - rabbitmq: add check rabbitmqLocaltion</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/5327c76d66cb6339d68036aeff52f13f315ca4f0"><code>5327c76</code></a> (rabbitmq) - rabbitmq: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/5c66b5a74037aa530ed84203c153a7d83f2ba6cc"><code>5c66b5a</code></a> (rabbitmq) - rabbitmq: change probe</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/27bebf99a4fac504dc3e4a2a8d395cc5c23c9ff4"><code>27bebf9</code></a> (rabbitmq) - rabbitmq: add start-rabbitmq script</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/86ee6a780841f4f4927aa4dc6bbc50362fc5f5a0"><code>86ee6a7</code></a> (rabbitmq) - rabbitmq: upgrade to rabbitmq 3.10.7</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/1f29683eb9630822c50687276941bf10b2e1c014"><code>1f29683</code></a> (redis) - redis: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/a5041fc911aa86b277f3577949637f090d7d0488"><code>a5041fc</code></a> (redis) - redis: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/64468c2257c828e61d183d4680b632ea0a24021e"><code>64468c2</code></a> (redis) - redis: add redis persistence</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/de5d7538e64ec86c2d7393dfab922dfe66d29bde"><code>de5d753</code></a> (redis) - redis: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/f6446395fbf46fd644ce3b12a3b5996e7a5b66a2"><code>f644639</code></a> (redis) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/98051d20ecb8f946c8e5093b50791df77494da52"><code>98051d2</code></a> (redis) - redis: premission denied</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/bcb548eca8ae83d1f828bd47e190b6f78a919635"><code>bcb548e</code></a> (redis) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/524aa412e589ed21c61e31ad03067f8b96a0e116"><code>524aa41</code></a> (redis) - redis: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/26c946651e503cf3be26225010fcf67a646e8c27"><code>26c9466</code></a> (redis) - redis: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/b67d7a25db6484862676b57d89530f5de4cd254e"><code>b67d7a2</code></a> (redis) - redis: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/839ec50c7c473dcac3fc2fb7e0a51a3493b3db62"><code>839ec50</code></a> (redis) - redis: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/237ca86c239a392e23ce9b7ce68bcf9d1d0da27f"><code>237ca86</code></a> (redis) - redis: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/bdd968d27a01a06110ac394fcb4f7893cfb0edc1"><code>bdd968d</code></a> (redis) - redis: upgrade neew require</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/8b2910f10b7f5b6da8828bf8558f4eb373fcc238"><code>8b2910f</code></a> (registry) - registry: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/eedbe78543bf04298134ee2900b21d9218fd99e5"><code>eedbe78</code></a> (registry) - registry: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/024161578b010ad70702ae9480cb07a9b210ca61"><code>0241615</code></a> (registry) - registry: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/9b58da4298fd28f3ca060ce2ffd11a0977b755e1"><code>9b58da4</code></a> (registry) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ab6acb71f85990865cd4322ef21e3d2ae0903ac8"><code>ab6acb7</code></a> (registry) - registry: change workdir to /workspace</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f368bf7d7dfb8357acc8bf5019d052057dba393e"><code>f368bf7</code></a> (registry) - registry: use DRYCC_UID DRYCC_GID env</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f4b9041f9c18721dcfc71091a89145323c5fc092"><code>f4b9041</code></a> (registry) - registry: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/c2e87ca32c58633e9f86b3422d48249b3c1d81a8"><code>c2e87ca</code></a> (registry) - registry: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/feb6aba75f16044ecd927e020372338cd6ddf519"><code>feb6aba</code></a> (registry) - database: bump mc 2022.04.01.23.44.48</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/956932b04720266b896c0ea150a595c77a513444"><code>956932b</code></a> (registry) - rregistry: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/deda8d8d7868938fa890b5e7a0f22911e7151837"><code>deda8d8</code></a> (registry) - registry: move registry-secret.yaml from workflow to registry</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f52c7bf6e4bc23d4f7b4e78224ff2d8da81198bc"><code>f52c7bf</code></a> (registry) - registry: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/007fe03a89f5e3b6d9baeda0b3fea84041a46ea4"><code>007fe03</code></a> (registry) - registry: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/d620c6db554f29b6c9b044c12b5dfd62194f274b"><code>d620c6d</code></a> (registry) - registry: <a href="https://github.com/minio/minio/issues/13799">https://github.com/minio/minio/issues/13799</a></li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/85e6b732126ea2dacb4db0d79b2fbb831b0d984a"><code>85e6b73</code></a> (registry) - registry: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/6a1155d75f7d6007f7ef3fe2c947423567c20e65"><code>6a1155d</code></a> (registry) - registry: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7b8ebae5738c401580391a631757fa4646a31f3c"><code>7b8ebae</code></a> (registry) - registry: change minio to storage</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/13389519866129557fe9e08b446eb3a3de163a71"><code>1338951</code></a> (registry) - registry: add check storage health</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/2fa769dcfb770b1f9789e3ab13f96380f3e708c6"><code>2fa769d</code></a> (registry) - registry: change probe</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f187cbf22c9206693656df844e2f97007dd95574"><code>f187cbf</code></a> (registry) - registry: add replicas</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/09d8a7b3cc69d6e0f90ab19b727f54b7129a3ae5"><code>09d8a7b</code></a> (registry) - registry: upgrade to mc 2022.08.28.20.08.11</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/4b187b8d076ef387b667e0807081021184c1f55f"><code>4b187b8</code></a> (registry-proxy) - registry-proxy: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/29ffbbe58737a14432a69938c69ff54c056b7f85"><code>29ffbbe</code></a> (registry-proxy) - registry-proxy: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/6d783baa4be1de057980040830fd6d3b161347a8"><code>6d783ba</code></a> (registry-proxy) - registry-proxy: remove use_cni</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/8cf05cff7cb44bf0b0f5c94e76567607d2f9adef"><code>8cf05cf</code></a> (registry-proxy) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/090e28647345560182a8f21da8f9445d567e3c73"><code>090e286</code></a> (registry-proxy) - registry-proxy: chore(imagebuilder): change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7cf6120e818b9a12799a305d8d17dfef8746a9b1"><code>7cf6120</code></a> (registry-proxy) - registry-proxy: use DRYCC_UID DRYCC_GID env</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/3a00697ed5de2230fc98971798d16de4ac6ceccd"><code>3a00697</code></a> (registry-proxy) - registry-proxy: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/30e69e8ca26894cc9efcd206665c5d96aa198085"><code>30e69e8</code></a> (registry-proxy) - registry-proxy: add registry basic auth proxy</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/942abce928797f2a77883f3a6a1a6720a6774c34"><code>942abce</code></a> (registry-proxy) - registry-proxy: upgrade to nginx 1.23.1</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/5ea3297285ab826c6686bcd20c34b1dd178615f6"><code>5ea3297</code></a> (storage) - minio: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/8306addad83bf486ae0d796d85b8f5593ca22ef7"><code>8306add</code></a> (storage) - minio: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/c917e9f3e1b03d0c9557f41f753c05f5d48f60df"><code>c917e9f</code></a> (storage) - minio: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/042c73208b255364db2cc08374a7b9ba39946edf"><code>042c732</code></a> (storage) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/7b47b82f903ecd1e6f6c1a30ed856f7153eaef20"><code>7b47b82</code></a> (storage) - minio: change workdir to /workspace</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/6f3531ef29ed032f3f0bcbc09211e9030a02340a"><code>6f3531e</code></a> (storage) - minio: use DRYCC_UID DRYCC_GID env</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/9795fb1c71641cd106dc06abeb355c8479b0a351"><code>9795fb1</code></a> (storage) - minio: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/a7b09c5b264fa9ce068ae06b12ac5fec6e7a63d4"><code>a7b09c5</code></a> (storage) - minio: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/76073428fa40f6048482594720707c1e92ca17d5"><code>7607342</code></a> (storage) - database: bump mc 2022.04.01.23.44.48 and minio 2022.04.01.03.41.39</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/ea2b2f15ffc2c4d263e537aa14a74f9c71a450cc"><code>ea2b2f1</code></a> (storage) - minio: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/445b50100629f5799b4137fa5d71a4768836f8d2"><code>445b501</code></a> (storage) - minio: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/f19fbc75f98c5f1349bdfe098c69bdf732a10886"><code>f19fbc7</code></a> (storage) - minio: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/8982e2eab58a059040d483c4ac373e9ccced0765"><code>8982e2e</code></a> (storage) - minio: use minio to distributed</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/06bec7372476dec97304f51754a9c031498fd888"><code>06bec73</code></a> (storage) - minio: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/9b8f0062892bcd4f720014a142efde4ce6ed10c6"><code>9b8f006</code></a> (storage) - storage: remove assert</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/59d64b92e21603e86573699e5b1e2914672cfe3a"><code>59d64b9</code></a> (storage) - storage: change listen to POD_IP</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/60044ee012378c0c344518f5945ed6dace124535"><code>60044ee</code></a> (storage) - storage: add juicefs mount options</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/189f944175bd9c16d3a8d5347a9040143903e15a"><code>189f944</code></a> (storage) - storage: remove volumeName</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/302fe8964b3171bc6c7cdddd494d5e3ca62c5209"><code>302fe89</code></a> (storage) - storage: mv to minio dir</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/6ec586d742cf14f311e2ac097ad207c2b3fb65b4"><code>6ec586d</code></a> (storage) - storage: change readinessProbee andlivenessProbe</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/0e028dfee98c4cf8a54110101f1084b03cf75b8e"><code>0e028df</code></a> (storage) - storage: add minio pdb</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/cf9bd2de2b8138b6a75c1d804e919586d2d53eca"><code>cf9bd2d</code></a> (storage) - storage: add check storage health svc</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/2dd5c9f20dcbbdb184d3e0be19a9e93b41ac1019"><code>2dd5c9f</code></a> (storage) - storage: add volumeBindingMode</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/fa2effc313905bf8e7a0d41d6d09335ca1a70552"><code>fa2effc</code></a> (storage) - storage: remove databaseBucket</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/d166cc721e45bf1955a2d99b70187ee9b3d6970a"><code>d166cc7</code></a> (storage) - charts: format network-policy name</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/d06bcce9fe0e8de7720e5c93b5d87e742be7f5a7"><code>d06bcce</code></a> (storage) - storage: upgrade to golang 1.19</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/c2ca05cd4b92259d4454723ab25252e4f6e220ac"><code>c2ca05c</code></a> (storage) - storage: upgrade new require</li> +</ul> + + + + + + Blog: Drycc Workflow v1.5.0 + /blog/2022/10/06/drycc-workflow-v1.5.0/ + Thu, 06 Oct 2022 00:00:00 +0000 + + /blog/2022/10/06/drycc-workflow-v1.5.0/ + + + + <p>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.</p> +<h2 id="workflow--v140---v150">Workflow ## v1.4.0 -&gt; v1.5.0<a class="td-heading-self-link" href="#workflow--v140---v150" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>passport v1.0.0</li> +<li>rabbitmq v1.0.0</li> +<li>imagebuilder v1.0.0</li> +<li>builder v1.2.0 -&gt; v1.3.0</li> +<li>controller v1.3.0 -&gt; v1.4.0</li> +<li>database v1.0.2 -&gt; v1.1.0</li> +<li>fluentd v1.1.0 -&gt; v1.2.0</li> +<li>redis v1.1.0 -&gt; v1.2.0</li> +<li>influxdb v1.0.1 -&gt; v1.1.0</li> +<li>logger v1.1.0 -&gt; v1.2.0</li> +<li>minio v1.1.0 -&gt; v1.2.0</li> +<li>monitor v1.1.0 -&gt; v1.2.0</li> +<li>nsqd v1.1.0 -&gt; v1.2.0</li> +<li>registry v1.0.3 -&gt; v1.1.0</li> +<li>registry-proxy v1.0.2 -&gt; v1.1.0</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0f5f8e4171313ea56de2d659d92458acd39a3201"><code>0f5f8e4</code></a> (builder) - builder: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f269d06ddc42464ba99ceeabc283645778034547"><code>f269d06</code></a> (builder) - build: add buildx supportjkjkk:q</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5e72fe88f057c1814c6d8075638d124445c16157"><code>5e72fe8</code></a> (builder) - registry: use docker build</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/25d8a4cbc14ccfeccc0a33d17fc723149103a0d3"><code>25d8a4c</code></a> (builder) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7a3e1c58942dfdfde474462f92a2a5bddf1c15a8"><code>7a3e1c5</code></a> (builder) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/46b75ff211da2985ce17737e7c6bb29ce73c8df3"><code>46b75ff</code></a> (builder) - builder: add cloud native buildpacks support</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2db2054dd960f80ee76c442d3705490c5f70358a"><code>2db2054</code></a> (builder) - builder: unified build model</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/4b7f9d9bc38c65ca56e162701b4cbce43c1cbbbe"><code>4b7f9d9</code></a> (builder) - builder: add initContainers</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b78c936ec706cce8bd8e8676a411187fed658b23"><code>b78c936</code></a> (controller) - token: add get token api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bac52a51b06872d48ecefabfb14b29b9f70d4357"><code>bac52a5</code></a> (controller) - tasks: use celery replace nsqd</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b9b0c58b1f877d077543efb202c71f5cec07b6fc"><code>b9b0c58</code></a> (controller) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/205dcb3b5b1003d704a0033d3a3b8b6761393df9"><code>205dcb3</code></a> (controller) - influxdb: add influxdb client</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ff15849bafddc47e06820ca89e8e95abc6c89311"><code>ff15849</code></a> (controller) - influxdb: upgrade to influxdb 2.x</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4016244757d764b553abd20ffb8ed79368c7caa1"><code>4016244</code></a> (controller) - controller: push data to influx</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/fcfce2ea7f6af657c46a1c53f0f78b7224b56ff6"><code>fcfce2e</code></a> (controller) - workflow-manager: add workflow-manager support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/00e9bfb627c11be35fd57c330d3127c84675b0f6"><code>00e9bfb</code></a> (controller) - influxdb: review influxdb code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/dd644d5a5e626d51ddb6f4d6488691ac7f2f2804"><code>dd644d5</code></a> (controller) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/118278b332877428f09d13801432a8c7f51ebbee"><code>118278b</code></a> (controller) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/122a9cd267f8b80d4b922938b97a71032f174648"><code>122a9cd</code></a> (controller) - oauth2: add oauth2 support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/559a5b6c76a0b9925bdd7d027e5653b7d494d4ac"><code>559a5b6</code></a> (controller) - controller: use cncf buildpacks replace slugrunner</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/96130e6900dae2bc31899e3a06fec87c5c6684c9"><code>96130e6</code></a> (controller) - charts: database configuration optimization of passport and controller</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2ea85089f9ef7814e7c504380929c09cd73fadb2"><code>2ea8508</code></a> (controller) - oauth: using passport authentication</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/868c437940b7cde4caaf0b4f81ab5265cd2f197c"><code>868c437</code></a> (database) - database: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/eadd5da76c3a5979a90b52b245dc9041da861d6a"><code>eadd5da</code></a> (database) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/b6eea4c09dcd95d7f8f0540c2ffef63567146167"><code>b6eea4c</code></a> (database) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/04a88dbafe96027068badd9e65c30b832432c371"><code>04a88db</code></a> (database) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/92ed309894ef2d065d4dc20acf5cf44dfafa84d7"><code>92ed309</code></a> (database) - database: add initContainer</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/ee6b78ff78bfe978edf2e9a9789bdf58c2dc846f"><code>ee6b78f</code></a> (fluentd) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f523e30c5e93d80e509232e7bb25f4de92267312"><code>f523e30</code></a> (fluentd) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/ee47b53b6f18bf4e2cdd41aaabf4dcd807d4b2d7"><code>ee47b53</code></a> (fluentd) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/80a51af1c0dbf689ead41a4b88d5e31861a7b0d0"><code>80a51af</code></a> (influxdb) - influxdb: modify influxdb naming rules</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/fb1003086e3819ada293e1792b46e966e509ee3a"><code>fb10030</code></a> (influxdb) - influxdb: use influxdb v2</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/0e87ad8c239a8cbb4ec02a584081ac1be0cb21af"><code>0e87ad8</code></a> (influxdb) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/9d108019d94ce2e653ec16482e89dff314810f9b"><code>9d10801</code></a> (influxdb) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/d825c9f7b4198c10e93abc7121af54f7af63f711"><code>d825c9f</code></a> (logger) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/b1395766670636ecbb42fb0b4ca1649186bfd4c5"><code>b139576</code></a> (logger) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/88f84ea95e334fcfef45ecd4f28c8bc468523574"><code>88f84ea</code></a> (logger) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/5ccae3ef8fa0894f08bf6ba552b17455a481a698"><code>5ccae3e</code></a> (logger) - dockerfile: remove chmod cmd</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/193aefc8c4106c7c6d5022c9183c68d6e604e735"><code>193aefc</code></a> (logger) - logger: add initContainers</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/baee3305a3b09a0fba83f33fb161400a7e7fd7fb"><code>baee330</code></a> (minio) - minio: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/ad5d055e170977801a6951813e4896d1f854e14f"><code>ad5d055</code></a> (minio) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/19868d457852e423536d8ae8f426a2c3437f423d"><code>19868d4</code></a> (minio) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/4bd84b8bb8af65a0ab05eff3a4c227452c4a3a2f"><code>4bd84b8</code></a> (minio) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/79d1f2f85c17c71ec609e8e191e04e9de87deec0"><code>79d1f2f</code></a> (monitor) - database: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/88e5a7f45886f5ca947e44052c5c52a2f8e17497"><code>88e5a7f</code></a> (monitor) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/5672e99a81ce856e4cd42a1b4e1083919e165272"><code>5672e99</code></a> (monitor) - influxdb: modify influxdb naming rules</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/867210310f29da9600bb2d052e05d5181cfe5a4f"><code>8672103</code></a> (monitor) - influxdb: use influxdb v2</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/66cb4c877ee0acfdcabab284da18b58266b61201"><code>66cb4c8</code></a> (monitor) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9576eb38c61048d3d540303047c8690763d664e1"><code>9576eb3</code></a> (monitor) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/30809c9ce3f31f52ac10616dbe9a24135d74828d"><code>30809c9</code></a> (monitor) - monitor: add initContainers</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/70d140ce05b061462a990029b9fd7ac749c383c7"><code>70d140c</code></a> (nsqd) - nsqd: using self compiled nsq binary</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/1073d4f35b082ea6dd63570d8427d7e3d1c2fecf"><code>1073d4f</code></a> (nsqd) - nsqd: use GOPATH replace /go</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/e49848037b54362f83ee063adc6e954afe8fa84a"><code>e498480</code></a> (nsqd) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/cf9b7d5cd6ee63d77acadec5c3a410acb60df400"><code>cf9b7d5</code></a> (nsqd) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/c335856f1ca9c80b0dc23df3445d395a13b8b50b"><code>c335856</code></a> (nsqd) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/efba7134453bc730b968d909089564de3de3079a"><code>efba713</code></a> (redis) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/c7a3b53025faa393bf6e915ec71b96ef7a5da27f"><code>c7a3b53</code></a> (redis) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/4cdad7bab726dd11973c1dbc643a81eb6313ba1f"><code>4cdad7b</code></a> (redis) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/652b443a4e5c54765bb40cfeb38310eee455a3c2"><code>652b443</code></a> (registry) - registry: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/4060176efaca5531faec4ecdd02eb30b6451e16e"><code>4060176</code></a> (registry) - registry: use docker build</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7102a03677830beb4b0ad093b141cb48ba948dd7"><code>7102a03</code></a> (registry) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/6c8600d293589b36748acf7b4dfb913f2cefde8d"><code>6c8600d</code></a> (registry) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/33a51c99e3f278c7c36dfc27c124db3dec530914"><code>33a51c9</code></a> (registry) - registry: add initContainers</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/bef70dc98c4b044d1108f6b42f439b36d37270e1"><code>bef70dc</code></a> (registry-proxy) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/d2319c1fce4e57cd9257ec3978f4e5a8d0101a23"><code>d2319c1</code></a> (registry-proxy) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/02fafed2b1b5648274c3d44c3d113a0a025e4fca"><code>02fafed</code></a> (registry-proxy) - charts: set the default chart version</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5499c9a2844c192285d5afdbf6a08d803a70cf8d"><code>5499c9a</code></a> (controller) - gunicorn: gunicorn not running</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/06e9e8869fbf61b3db753ab211bd9d465afa9058"><code>06e9e88</code></a> (controller) - controller: error loading shared library</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/01b5bd04cf1848b876b2b5acbeae6c361bebf975"><code>01b5bd0</code></a> (controller) - controller: upgrade celery config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6e32d55cf9de3dce1b7d470f850c2d155809cc07"><code>6e32d55</code></a> (controller) - controller: fix update resources bug</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0e0d53f3056dfbf427ad7a474786e723b87cb39c"><code>0e0d53f</code></a> (controller) - chart: set the domain depends certManagerEnabled</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2ac4ca839d76a4b80205506938d63f25bb4abea0"><code>2ac4ca8</code></a> (controller) - passport: error loading shared library libexpat.so.1</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a0dd517e189a2ba9472c0d320ba32d091520dcbe"><code>a0dd517</code></a> (fluentd) - fluentd: drone build</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6eca2a3e17e2965816718963fe4d7f6ffeb15a42"><code>6eca2a3</code></a> (logger) - logger: golang lint</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/63b0aa0989db8f9e15daa415c5a0b56e9350c0a9"><code>63b0aa0</code></a> (registry) - drone: charts url error</li> +</ul> +<h4 id="docs">Docs<a class="td-heading-self-link" href="#docs" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/472cfcc226c98d2b9a74c367519d57ec31890b71"><code>472cfcc</code></a> (controller) - controller organize README.md document</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/d9d6e292c602c3538784de6755b40f4655710278"><code>d9d6e29</code></a> (redis) - redis: delete links that do not exist</li> +</ul> +<h4 id="test-case">Test case<a class="td-heading-self-link" href="#test-case" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1468f57465243709594b0d6472636ccc0d7b7f62"><code>1468f57</code></a> (controller) - controller: add command unittest</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9999bfd30ab9550966eb70a6e52efbbb38f5cef1"><code>9999bfd</code></a> (builder) - builder:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/cda8b5814e507ab72a0ce7125eaa8d6bdd168a06"><code>cda8b58</code></a> (builder) - builder: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/dc575dde93ad1334be9d1337fbc1b0b66a06ebd9"><code>dc575dd</code></a> (builder) - builder: use imagebuilder replace dockerbuilder</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d3bb183df646a7f2503c739633bb6d5d61778219"><code>d3bb183</code></a> (builder) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5fe34d1fee978986729120af7d5732ed3759b88c"><code>5fe34d1</code></a> (builder) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7e364532bf841109fe5e75c6a5c357ad46f7c4b7"><code>7e36453</code></a> (builder) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/52b8d9df26f28e562b4eca72e777106db86db9db"><code>52b8d9d</code></a> (builder) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/65963f4b35d2b60e376818d314cd203fb698eaba"><code>65963f4</code></a> (builder) - k8s: add privileged to dind</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d345fcf23f1c3e755ec646d988c5d1e0e90d2eba"><code>d345fcf</code></a> (builder) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7975c998252a66557bbfa774ac18f18e17a5ddbd"><code>7975c99</code></a> (builder) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/59633dd9197fed8400d8007cc93e7a62404e92b1"><code>59633dd</code></a> (builder) - builder: modify launch imagebuild pod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8d14e67e5e84c2d6b6254b7704219c9ed38aac67"><code>8d14e67</code></a> (builder) - builder: use Procfile in anywhere</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5357fa88e56ef24fac7f8d3dc0bfa5d990c1be58"><code>5357fa8</code></a> (builder) - go: bump go mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8d26ac054edeb67e4ce473507a96951dbda10db2"><code>8d26ac0</code></a> (builder) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0af620def4db8473c799c9499a4a27ee4a278210"><code>0af620d</code></a> (builder) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ae84303f6d15b22c525e62cf3ae2d1e314d9a67b"><code>ae84303</code></a> (builder) - builder: run imagebuider replace pod with job</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/3b2c496a00a8512731c18d79215ce9e279b60e19"><code>3b2c496</code></a> (builder) - builder: change docs website</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5679a4cfefd214b7bb0014cde3f7c461bd70ca91"><code>5679a4c</code></a> (builder) - builder: upgrade to golang1.17</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a214503452b10f3e265d97954964d321480b007d"><code>a214503</code></a> (controller) - controller:replace whitelist with allowlist</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/375ddcc15761326b8c74f8cd78a239cfe9c14224"><code>375ddcc</code></a> (controller) - ps:drycc ps:list show autoscale num</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c32e409b6fe09c533bc5cfdbf35b47e633d2a644"><code>c32e409</code></a> (controller) - ldap: canot register when ldap is enabled</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c46580a6264cbe21ee5240fde5791c9c78ef2a19"><code>c46580a</code></a> (controller) - controller:modify redis config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/fa9e87b6131a9669eebafb4bfea26dc5f15bde64"><code>fa9e87b</code></a> (controller) - chart:modify controller charts</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6f9fd081e6826fd89316ff4d064c9cf03501e1d3"><code>6f9fd08</code></a> (controller) - nsq: remove nsq</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/994b2dc68afdeaedc540525422183565bc1e3230"><code>994b2dc</code></a> (controller) - docker-buildx: add check-docker</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a720c3a9933aaaa15d5933143708fbcac2d5233a"><code>a720c3a</code></a> (controller) - controller: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e9a5c843d0abd85ae57d8cb87cbe7369364b07e6"><code>e9a5c84</code></a> (controller) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a26614acb4fb8cef5030e0e56681939977a7a266"><code>a26614a</code></a> (controller) - controller: add rabbitmq env</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3df229d2d31b6f8fc79a260e5088a86d00716459"><code>3df229d</code></a> (controller) - controller: modify database config &amp;&amp; remove redis port config &amp;&amp; add env prefix with DRYCC</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/257e94b429c8f7b0c636a083215d9709baaf5c8d"><code>257e94b</code></a> (controller) - controller: CELERY_BROKER use rabbitmq and modify celery-deployment cronjob</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f4d6ec343ec3fb618ef9ee8da09474294d49807e"><code>f4d6ec3</code></a> (controller) - chart: pretty chart format</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/63e61951cda276fe59a91a64a7b84f7feb66ce6d"><code>63e6195</code></a> (controller) - influxdb: modify influxdb code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0f6d408734984e4ec9bbc56c0a4b68ba5783b680"><code>0f6d408</code></a> (controller) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/87bad28b65b773e6534c4cc8e2128045d3ffb7c3"><code>87bad28</code></a> (controller) - python: upgrade to python3.9</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e8f75603cd0cd38423d774f1b3220b64ef9eb6dd"><code>e8f7560</code></a> (controller) - volumes: modify mount summary</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6cf6c6bdbf029b1e52a36d5148d5a025fb6d04c1"><code>6cf6c6b</code></a> (controller) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a9397e8c06a69d5539e8f5b67be242932e69c2c8"><code>a9397e8</code></a> (controller) - oauth: modify token Authentication</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c7f8c8b3b2294205603afd9ca4a7ba2e3f6cea02"><code>c7f8c8b</code></a> (controller) - deps: bump django from 2.2.14 to 2.2.18 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a1a08aa4165ba678e979d6ca4477694999d0e5b8"><code>a1a08aa</code></a> (controller) - deps: bump djangorestframework from 3.11.0 to 3.11.2 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/efd78b42038a404d53d06e92bb609cc7f97739db"><code>efd78b4</code></a> (controller) - deps: bump django from 2.2.18 to 2.2.20 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/649b044c644c9729b80e5f0e2663779bcc648ef2"><code>649b044</code></a> (controller) - deps: bump django from 2.2.20 to 2.2.22 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/41b742bbec9370490b0176fac407bcbd83abd2ed"><code>41b742b</code></a> (controller) - deps: bump django from 2.2.22 to 2.2.24 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/22ffe5d8dd51cffc38e5e3757ac97eba02861e2b"><code>22ffe5d</code></a> (controller) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c98b46837efa85a5daf46c6dc40d45606b7548bc"><code>c98b468</code></a> (controller) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/20e6edb1001fb709ea877349771404ee807ae36d"><code>20e6edb</code></a> (controller) - chart: modify the problem of using buildpack</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/db16879a4ce64c7020b7622603f53ef88898be0a"><code>db16879</code></a> (controller) - controller: pretty pods list print</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ba6f456ddb0a48a0e8c1f446330a838ba27b8f48"><code>ba6f456</code></a> (controller) - test: pretty pods list print</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5fce4b7a77c91836d921c6d1f4cb8cacb2ab953d"><code>5fce4b7</code></a> (controller) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e9e0bcb36d4b6b1169446c484357260aee7feba7"><code>e9e0bcb</code></a> (controller) - oauth: using passport authentication</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0311172bea0f1d28959ee528c0e50493d0c8d425"><code>0311172</code></a> (controller) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/150eff1c246b908e8f5521cc1e5e9ff4c765433d"><code>150eff1</code></a> (controller) - charts: update cert-manager api version</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/de8545a568984f52e5757806d9ce631864285fed"><code>de8545a</code></a> (controller) - controller: update requirements</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1442207889955cbf230bd1c87867acaab72256fb"><code>1442207</code></a> (controller) - controller: using django native JSONFiled</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ab4e836a55aa61cbdb222a8fc606b5619625337e"><code>ab4e836</code></a> (controller) - oauth: modify passport api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5c54e0642c76bfa1253397177b5aef2dc28dc611"><code>5c54e06</code></a> (controller) - controller: eliminate pip warnings</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/870328ddf06ab6b3004fd0e56516de6496c06e26"><code>870328d</code></a> (controller) - controller: remove entrypoint</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5e5e6ae5763333989e153119c6078c06788d0f78"><code>5e5e6ae</code></a> (controller) - controller: upgrade celery config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/607778ffb2f81b74457db2b34952a0cd01647eb3"><code>607778f</code></a> (controller) - controller: add initContainer</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/23dc016da2419237814a7d1ac54435adc99f0423"><code>23dc016</code></a> (controller) - chart: set the domain depends certManagerEnabled</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f3cf20b610a649d105e4889212272604615ddfa7"><code>f3cf20b</code></a> (controller) - controller: remove default bash env</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/73f26364110a1cdee5bdfe868e4fbf0be2cdbcf4"><code>73f2636</code></a> (controller) - controller: modify alpinelinux repositories</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/498e9f2fbd5470ff8079e09eacc04be4272d9601"><code>498e9f2</code></a> (controller) - chart: change certManagerEnabled to boolean type</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/27f5308938f972d078e78c539e9160cc2f3b3a1a"><code>27f5308</code></a> (controller) - passport: exclude cryptography</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/370b75dc9cbdcf24b3955b562ff276e3214eb5a2"><code>370b75d</code></a> (controller) - controller: use sh env</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/07585b4f45471b22e6942590dac51cf724e8bd57"><code>07585b4</code></a> (database) - postgres:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/20172dcfac8370b389aa26a30cc9e2f0a96f6a6d"><code>20172dc</code></a> (database) - database: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/abb9b88a96e0098d3fb1128d123825ca4faea3a4"><code>abb9b88</code></a> (database) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/e72f58ffa50be0f5170423529292872fcd53cfea"><code>e72f58f</code></a> (database) - chart: modify the off-cluster database</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/a91f64f694c15143b7210597ffdd7dacfa6668bf"><code>a91f64f</code></a> (database) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/614fb76a1c77b8f5697a87aadfd094d6eaa8c27b"><code>614fb76</code></a> (database) - tests: use add-host replace link</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/a3428f353c38f440381890fd80416ad302033352"><code>a3428f3</code></a> (database) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/239fef11f87655203f6090e55259cb09906fb253"><code>239fef1</code></a> (database) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/42858e1e2ae1a09e1bad75e1fabb7ec4115e7197"><code>42858e1</code></a> (database) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/d0fe85094eb305ce071f51bf40bdf2099b88ea13"><code>d0fe850</code></a> (database) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/34a36ad4f650d6eaf2320e55f4d80a06e0dd1675"><code>34a36ad</code></a> (database) - charts: Nn secret is generated during off-cluster</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/064ccf462a1bd2fe513809c39919fc1ccaba7801"><code>064ccf4</code></a> (database) - database: create database</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/9228992327543f008bf4158be8b8cd1777c3ba90"><code>9228992</code></a> (database) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/9f7810c6dcf6323bc6f75345f4c9fc25a5e11ef6"><code>9f7810c</code></a> (database) - database: upgrade to wal-g v1.1</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/05783f4118cd7e8cc80e41c20656f5b16961fa3d"><code>05783f4</code></a> (fluentd) - fluentd:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/0739809ba68d12ef8940f0f6addcfea7353885f5"><code>0739809</code></a> (fluentd) - influxdb:replace monitor-influx with influx</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f02487cea73f20a2039fe6c1960950a3b73107b5"><code>f02487c</code></a> (fluentd) - fluentd: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/2c96cc089f7965286409cb4d710df5ab947b20b5"><code>2c96cc0</code></a> (fluentd) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/b20c429b9ace293c7add60fa350098b91285bf87"><code>b20c429</code></a> (fluentd) - charts: remove port config</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/6dd019721438cf32f2262bdb76d74da9ab5b37a3"><code>6dd0197</code></a> (fluentd) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/c5bec512a902662a8200639b3b574925c836e734"><code>c5bec51</code></a> (fluentd) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f8524b78536b6d6cc1022e3cfa6ab61ac36fbca8"><code>f8524b7</code></a> (fluentd) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a50878aabea91b3fbbafaf9c1f43c2eca7fe5a5c"><code>a50878a</code></a> (fluentd) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/14fe20e811ba3c8814188dcec18ed69c169c4b9d"><code>14fe20e</code></a> (fluentd) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/4a2f66070910abcc3068d0e03a8e52d1e5d2659d"><code>4a2f660</code></a> (fluentd) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/de2dd9178130101f4b0c5ed82d5e80a1ba4dd591"><code>de2dd91</code></a> (fluentd) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a9f1944c3dcac5e8f0eb2f44d11ec81517735b8c"><code>a9f1944</code></a> (fluentd) - fluentd: upgrade to fluentd1.14</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/7cb4e954704cfa5ff37d3b95b5e9a231188f4264"><code>7cb4e95</code></a> (influxdb) - influxdb: change username to user</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/0fdc21b2a95003abd488cb05b640ec1fa1db3ff7"><code>0fdc21b</code></a> (influxdb) - influxdb: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/b2acddb8d72bd0e17fb0b543a8f98e2fa5d57735"><code>b2acddb</code></a> (influxdb) - influxdb: change default path</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/ba8891910d5ef9084f9dd9b7569d905e19f056ea"><code>ba88919</code></a> (influxdb) - influxdb: add check_env function</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/91174010ed68356d9b813b70e2def18af9ed5186"><code>9117401</code></a> (influxdb) - influxdb: modify init_influxdb has_bucket</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/092a3e6b96e9494f00e7a0627b2aa9ce1212c7d4"><code>092a3e6</code></a> (influxdb) - chart: pod not readiness</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/51de380cc83177be8bdb557894b9fd5c28ed0a3d"><code>51de380</code></a> (influxdb) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/66d76679cc55578d13274fa5bf0e653b258e57b4"><code>66d7667</code></a> (influxdb) - docker: replace influxdb base image</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/3aa30943cea519fff18c23264c99c226cfb43c80"><code>3aa3094</code></a> (influxdb) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/14b9c24f110297e5b6a632ce4ad94625f5663038"><code>14b9c24</code></a> (influxdb) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/02b4cd111c092393b0f2d3f1c1654d0476603b03"><code>02b4cd1</code></a> (logger) - logger:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/114b5d5392a1d82f8dc73b4b1527e742fcaf22f1"><code>114b5d5</code></a> (logger) - reids: delete the logger prefix of redis</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/639278a8f055d7872491db2240f4327d4f77114e"><code>639278a</code></a> (logger) - redis: remove logger from redis conf</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/90195e27521b44e0d43f8fb7ff9ab9a658f60676"><code>90195e2</code></a> (logger) - go: remove GOOS and GOARCH</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/31e2e27f9160e62b199c196972fe5c0097a78a22"><code>31e2e27</code></a> (logger) - logger: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/8fbd9fa7b119f112221be5fa5bdc21e3a891a6b9"><code>8fbd9fa</code></a> (logger) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/b39df2d46e0f625900f80d0103a5a35c4e7fbb0e"><code>b39df2d</code></a> (logger) - charts: remove redis\nsqd port config</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/35d6d0784df91dc1036928c83905052962a84ca0"><code>35d6d07</code></a> (logger) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/69aabf527a1bea60f6d7792a488ed074d138a27a"><code>69aabf5</code></a> (logger) - tests: remove docker link</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/e916644cd89379731f5a9990044e3f64d570b6dc"><code>e916644</code></a> (logger) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/d6872b7cfbd30d0be087270b581a0730961f4b8b"><code>d6872b7</code></a> (logger) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/37801daabfe98292c54ed2902aeb120069448b64"><code>37801da</code></a> (logger) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/cfb4b38897136e5c1b942433b52944cdccc9b195"><code>cfb4b38</code></a> (logger) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/8bda3bf9906424c9be8661ab0d6850ae6e3352ea"><code>8bda3bf</code></a> (logger) - go: bump go mod</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/e13ebfcd5fc940393e1d398623650bfcd31c24de"><code>e13ebfc</code></a> (logger) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/38e6d8d592ad42a176d08f0d7edbe38e55b39b72"><code>38e6d8d</code></a> (minio) - minio:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/d6925ddec232dd3b6187414f4a11327330baa95a"><code>d6925dd</code></a> (minio) - minio: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/d56bc39ba487c24e89a47e6c63375342ba3c3552"><code>d56bc39</code></a> (minio) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/e4696cc243711c53a1fe16051cd80209c8a3d281"><code>e4696cc</code></a> (minio) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/70c5c7988a513b5a39b92e442b0f9052d1507f67"><code>70c5c79</code></a> (minio) - minio: use latest version</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/773cf6c47a4ab539dcac29084980953bdd0e9e04"><code>773cf6c</code></a> (minio) - Makefile: remove DEV_REGISTRY ?=</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/5ce5bc696e7522107139cccfec37c6dc4b759059"><code>5ce5bc6</code></a> (minio) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/5da8be3ca9345e7a6c87ad61bf104b7345523691"><code>5da8be3</code></a> (minio) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/c1f0611fed4e73a5109f1d15901721fa968d6c34"><code>c1f0611</code></a> (minio) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/b73f7927c34fca39605e13930a06fad829658e7b"><code>b73f792</code></a> (minio) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/79d1c935ee59bf45af52a1265aa87e2ef3233f40"><code>79d1c93</code></a> (minio) - go: bump go mod</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/c448899edbaacf8d54cdbad53561733069c1020b"><code>c448899</code></a> (minio) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/15ee49ef85be819d3f6eed5dde4551ffa31f5fae"><code>15ee49e</code></a> (minio) - minio: migrate deprecated warning</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/9968a1a2095fecda1d3ba3fbd2263e83494d716e"><code>9968a1a</code></a> (minio) - minio: upgrade to golang1.7</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/14fedd29ba64e02c05b6cd5fb06bd261bf9f367b"><code>14fedd2</code></a> (monitor) - monitor:replace the special works</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/52c431ad1701cc15e03d55cbc436c5f4f7472522"><code>52c431a</code></a> (monitor) - reids: delete the logger prefix of redis</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/2c95b47a1f714a421be5860a78dd94c23ddcfdf3"><code>2c95b47</code></a> (monitor) - redis: remove logger from redis conf</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/da9bc5605eb4a118bca92fdff3cc49c2f208c040"><code>da9bc56</code></a> (monitor) - monitor:remove influxdb</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/53f47b9a3b8dec717d049b9be3961e4efd446381"><code>53f47b9</code></a> (monitor) - grafana: use grafana docker image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/5bdb188a7255e845cda8a49806053f12032d196d"><code>5bdb188</code></a> (monitor) - grafana: use grafana docker image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c0586dda982c857e61b89964f34b57028cfaa29c"><code>c0586dd</code></a> (monitor) - monitor: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/87d02b6c80ef04c1170e848e9febdb723c9503c3"><code>87d02b6</code></a> (monitor) - charts: add nodes and persistentvolumes rule</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/1b5598fb479f85808bb33ef29b8cd21ab9d40bc6"><code>1b5598f</code></a> (monitor) - monitor: modify grafana dashboard with FLUX and pretty config.toml</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/bcbc0d5b3ef1b16a9e4b22208f5c628156a556cc"><code>bcbc0d5</code></a> (monitor) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9418c9e13b4fb20f4174ee965044cf30ca12ae38"><code>9418c9e</code></a> (monitor) - monitor: fix upload dashboard error and modify INFLUXDB input</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/589f29a84eeab3f9fbc1cce1e49a601938a32987"><code>589f29a</code></a> (monitor) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f776f8a650fd4c0c1e5f21dc9aa38ad36ca5be72"><code>f776f8a</code></a> (monitor) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6ca306092ca874c666066dffce4f3f8fad11bbcb"><code>6ca3060</code></a> (monitor) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6a9ffb24264ff8d7e5e9407f811e5b38b9e20a38"><code>6a9ffb2</code></a> (monitor) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/45e41ed8d104205a708fd82327e0fa3f3ac3d97e"><code>45e41ed</code></a> (monitor) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/654d407bea3cc3e686416cb2f6e1224990bab741"><code>654d407</code></a> (monitor) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/41e9b9c3c1b371ea815cd480e33c53779c2211a7"><code>41e9b9c</code></a> (monitor) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/99c10d38471587b09fb51ee65c8e602e443b44e7"><code>99c10d3</code></a> (monitor) - charts: update cert-manager api version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9bf83c40a846784e8375db884a2d417073324408"><code>9bf83c4</code></a> (monitor) - oauth: user oauth passport</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/a128f6d5f97fc060a80a2384f4a2dd2dc916dd12"><code>a128f6d</code></a> (monitor) - chart: change certManagerEnabled to boolean type</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/8f897fe306e15f4d528d0665171d634f0d9b93c4"><code>8f897fe</code></a> (monitor) - chart: set the domain depends certManagerEnabled</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/ba6d793c6110993b227246b8bf0bb861fc468975"><code>ba6d793</code></a> (nsqd) - README:update travis build status</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/49879c4baba2a6824b9f32bb2734aec21debefb0"><code>49879c4</code></a> (nsqd) - nsqd: minimum git clone code</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/c5e26805e49bd1be880fd4857b435359a0840992"><code>c5e2680</code></a> (nsqd) - nsqd: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/21dd17b886aad7e673fdb72fe4ccce3d9786a623"><code>21dd17b</code></a> (nsqd) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/7d86b3cbb2452da48abcc99f165dfa8954f103bb"><code>7d86b3c</code></a> (nsqd) - charts: remove port config</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/c073d952af18ffd83b6f86ce7a55140b36029a63"><code>c073d95</code></a> (nsqd) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/55c297ca70952986cb6a971593bbe0e64adea029"><code>55c297c</code></a> (nsqd) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/165c2aef05413585886651299c11dfb741469b0c"><code>165c2ae</code></a> (nsqd) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/9c6a1f8eb363e1d09eaef29c97eff7b60053103b"><code>9c6a1f8</code></a> (nsqd) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/92830984c4627f1a034f8fcfcb490a09576aa960"><code>9283098</code></a> (nsqd) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/46acf8a349c2d8462ee2ec0b592bde8a26e5f459"><code>46acf8a</code></a> (nsqd) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/43caf8058c5c9b129744c1a191f234d3b44c793f"><code>43caf80</code></a> (nsqd) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/689747119e18e2f1151404beb1729cad9d6ea5f6"><code>6897471</code></a> (nsqd) - nsqd: use official image</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/297bc05baf835ffe4d103bb6cb7613aa1286be68"><code>297bc05</code></a> (redis) - redis:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/f5f8b5e75b99f11e20a1b3210e4c4a42e342df92"><code>f5f8b5e</code></a> (redis) - reids: delete the logger prefix of redis</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/af7b657e76bbc1201391fe3915e081bd220b96a8"><code>af7b657</code></a> (redis) - redis: change logger-redis to redis</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/8dca154e5ae4a38b42e1eb6e16e01f3e78d5fee1"><code>8dca154</code></a> (redis) - redis: remove logger from redis conf</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/eaeda2d2650c61768092ea7f5846733328e47dc6"><code>eaeda2d</code></a> (redis) - redis: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/53c6358e7fbaf02ec15d0a01afa5e02769e3bfb4"><code>53c6358</code></a> (redis) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/ae37416efe8b6fcfdfabf2d444bd241e7128d889"><code>ae37416</code></a> (redis) - charts: remove port config</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/e985656354c17c1221d8ec35007710e0b9d4f6a3"><code>e985656</code></a> (redis) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/423336a645aa3b5091b76e88e58b501357cc733c"><code>423336a</code></a> (redis) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/be64ab4c2fd6e1edd33ca8c5a4458c74bf6fa372"><code>be64ab4</code></a> (redis) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/3bec735f6849b5649c5a2416e8fdb76fb6c780d7"><code>3bec735</code></a> (redis) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/4f934f6ee96925b70463c660416706eafc21fc3e"><code>4f934f6</code></a> (redis) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/359b8780f014c1627a1290e32231cd53caf6f762"><code>359b878</code></a> (redis) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/83b8ac299c215de85e85485c6c0546bc25a37ab1"><code>83b8ac2</code></a> (registry) - workflow:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/869b280b55534a7fbd2dfc9052044cb487d97730"><code>869b280</code></a> (registry) - registry: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/999c1e936026b79dc0462da166998f3fa4cebec3"><code>999c1e9</code></a> (registry) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5652da941334dfdddbe2636d974e9d687b0d912d"><code>5652da9</code></a> (registry) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/cc8c6c2bc077bad277232d25bc536416dfa6c244"><code>cc8c6c2</code></a> (registry) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/c7bdbd0e67e6bcd35423db7d05aca99a511054ed"><code>c7bdbd0</code></a> (registry) - CICD: pretty .drone.yaml format</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5c55a38592dfd1a7356992018f15f022c02fdfc6"><code>5c55a38</code></a> (registry) - test: use add-host replace link</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f8866f3e6b4f94e15815e5f79b2adbebe3fd1ed1"><code>f8866f3</code></a> (registry) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/6c8292f9c65b38816fad79bf3f49ff54ad8760dc"><code>6c8292f</code></a> (registry) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/1d50f2ce75f708fd3b07b0c5d5dff2f4bdb8adc7"><code>1d50f2c</code></a> (registry) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/efbca6d2c99e2b170e945f050afa8fb139398a49"><code>efbca6d</code></a> (registry) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/2eafc592dc68c529a8a3a8077ef9d48916718079"><code>2eafc59</code></a> (registry-proxy) - registry-proxy: update nginx</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/071bd86ae3bef755f47e22aad54762a7f1e4c0f1"><code>071bd86</code></a> (registry-proxy) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/c72db9618ee6a73655b4b2c5e940ee9fc9447380"><code>c72db96</code></a> (registry-proxy) - registry-proxy: change travis icon url</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/63ffb920f62b692071fcbf825cbac55bbebe6598"><code>63ffb92</code></a> (registry-proxy) - registry-proxy:replace the special works</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/1d904a61de6cc38bfb071a965de09f5dea0d9996"><code>1d904a6</code></a> (registry-proxy) - registry-proxy: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/c8200b1f6f573dba0edb19509fdb56a8357828c7"><code>c8200b1</code></a> (registry-proxy) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/d3fa939d910c7b0c707f191b174d1fce89e4cdb6"><code>d3fa939</code></a> (registry-proxy) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/5a8b353fa642dbef5929d372ef4ce39657bd40fb"><code>5a8b353</code></a> (registry-proxy) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/703d05a7fa07fc8d5b4c5c4ca0fed8a1ee156536"><code>703d05a</code></a> (registry-proxy) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/aa71db189c6b489347d8f723bdf881bc0b0abf67"><code>aa71db1</code></a> (registry-proxy) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/710c1260065431acf427bdf7d6d6319024598852"><code>710c126</code></a> (registry-proxy) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/2dcc5e6c4b469cb74b56c8c1f0b69d1d5c58291a"><code>2dcc5e6</code></a> (registry-proxy) - chars: change org to imageTag</li> +</ul> + + + + + + Blog: Drycc Workflow v1.4.0 + /blog/2021/10/06/drycc-workflow-v1.4.0/ + Wed, 06 Oct 2021 00:00:00 +0000 + + /blog/2021/10/06/drycc-workflow-v1.4.0/ + + + + <p>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.</p> +<h2 id="workflow--v130---v140">Workflow ## v1.3.0 -&gt; v1.4.0<a class="td-heading-self-link" href="#workflow--v130---v140" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.1.0 -&gt; v1.2.0</li> +<li>slugbuilder v1.1.1 -&gt; v1.2.0</li> +<li>dockerbuilder v1.1.1 -&gt; v1.1.2</li> +<li>controller v1.2.1 -&gt; v1.3.0</li> +<li>slugrunner v1.1.1 -&gt; v1.1.2</li> +<li>database v1.0.1 -&gt; v1.0.2</li> +<li>fluentd v1.0.1 -&gt; v1.1.0</li> +<li>redis v1.0.0 -&gt; v1.1.0</li> +<li>logger v1.0.0 -&gt; v1.1.0</li> +<li>minio v1.0.1 -&gt; v1.1.0</li> +<li>monitor v1.0.1 -&gt; v1.1.0</li> +<li>nsqd v1.0.0 -&gt; v1.1.0</li> +<li>registry v1.0.2 -&gt; v1.0.3</li> +<li>registry-proxy v1.0.0 -&gt; v1.0.1</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fc7d93f718019cfae02b04c745470b4975c91a84"><code>fc7d93f</code></a> (builder) - builder: use go-dev</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0c2159e4a44f0c3f635dcee1b95afdd741d1935c"><code>0c2159e</code></a> (builder) - builder: fmt code and add create_bucket script</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1b88340205ac77e84ebba7a42215d7d3d40578a0"><code>1b88340</code></a> (controller) - controller: remove deprecated api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a92fdebab64716e4194653a9a17f1c00f70c882d"><code>a92fdeb</code></a> (controller) - routable: ingress support routable</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1e3eab3602538f266305a78c9244be466d685c68"><code>1e3eab3</code></a> (controller) - maintenance: add maintenance support for ingress</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/56b9dd0691c904bd75df928bace98830879eb31d"><code>56b9dd0</code></a> (controller) - crt: support containerd-ctr</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5fc3b46b2acd67af89590f1c7dd85fbfa5e989a6"><code>5fc3b46</code></a> (controller) - controller: add ephemeral-storage restriction</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d677e52c288431517de9ae4bddaaadbd1c8b976c"><code>d677e52</code></a> (controller) - controller: add a volume command</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5f1323a837c71127bb99fd8631934c5bd0cab2a7"><code>5f1323a</code></a> (controller) - controller:drycc run cmd add &ndash;mount para</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/74c36a51eef46ea1c110ee53472be632079ce5e1"><code>74c36a5</code></a> (controller) - tasks: add distributed async task</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/139c3ca9d01d7188c1a499dfffad7b7697e5fd0f"><code>139c3ca</code></a> (controller) - tasks: change nsq reader to async</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f237d74ca6344a5929c9b5089dae07a38c13753b"><code>f237d74</code></a> (controller) - controller:add drycc resource cmd</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/41b46d0653d39d0bdfb42907f7a0b9863bc20992"><code>41b46d0</code></a> (controller) - controller:add drycc resource cmd improvement</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c26f7d82e8fa6fcf4b45ab16fcb0298cb2880f6a"><code>c26f7d8</code></a> (controller) - controller: add LimitRanges support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/45b5d1b904abe94819c3dd306117dcd4e09123ed"><code>45b5d1b</code></a> (controller) - users: add users status api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4e16f9b86ac24b4c62d7d6fddb33278d1880dfa7"><code>4e16f9b</code></a> (controller) - ps:add ps:stop/start command</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c659fa9e058620fd8ce0ba4fcfc48898f1219f2c"><code>c659fa9</code></a> (controller) - k8s: add k8s cluster domain</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/31a625d71733b47944876ac3fb58fe55cd9b746b"><code>31a625d</code></a> (controller) - ps:add ps:stop/start command</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/00a779a5dbb60a33b621fae13b30a24e39ac55f3"><code>00a779a</code></a> (fluentd) - fluentd: support containerd log format</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f3f1bd42697f08340b6b6f5fbe161c5b6fbb31b6"><code>f3f1bd4</code></a> (fluentd) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/db7147c0e7556a655e185c6f00419f99aff4ed29"><code>db7147c</code></a> (fluentd) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/689c12eed60f53e1afbbcede91a5955360183fa7"><code>689c12e</code></a> (logger) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/78ccc5de7718b8f6fb1caf701d1b4ef72fc64362"><code>78ccc5d</code></a> (logger) - redis: add redis client cluster support</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/9843f2cf9d1d03511296bf7731b59d547bc10387"><code>9843f2c</code></a> (logger) - k8s: add k8s cluster domain</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/6ba122e8b6cbdf7b73785d21961056e6b9fc91ee"><code>6ba122e</code></a> (minio) - minio: add pvc support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/69735500c483f9144f461a2b8a3444e51ddd4dc4"><code>6973550</code></a> (monitor) - monitor: add ingress for monitor</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/cd733053287efbd12c29217cd47c6345c39457ce"><code>cd73305</code></a> (monitor) - charts: add volumeName support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/4769fe9e8d14bdbdca9447f9df23c67c09db2a45"><code>4769fe9</code></a> (monitor) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/87806df02cd84fc5feec304e9bc6e32996396b80"><code>87806df</code></a> (monitor) - k8s: add k8s cluster domain</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/4db40c4f129115019ef41c14df56a2d0092e9da1"><code>4db40c4</code></a> (nsqd) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/b6f3d4fe0f6bc8d3467fdebf21374bed378edf9e"><code>b6f3d4f</code></a> (nsqd) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/74b85bb9efdcba88a25a2734d512d07ef8068032"><code>74b85bb</code></a> (redis) - redis: change redis to statefulset</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/ff98b5018610d0e2be0ec5c03c7a11232199811a"><code>ff98b50</code></a> (slugbuilder) - slugbuilder: delete build hook</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/b201c2ff207eddac7327f75d698a77e89d4125a1"><code>b201c2f</code></a> (slugbuilder) - buildpacks: use drycc buildpacks</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0ec042db3c8a4db39088ffe381f518abdb55287d"><code>0ec042d</code></a> (builder) - test: fix test case error</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/4fb113b7351f9f02612b3e14b4d0787b77abb3b2"><code>4fb113b</code></a> (builder) - build: base image replace by alpine</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/443df48c699846c176c1e4a12b5bb42abe790633"><code>443df48</code></a> (builder) - minio: fix not bucket error</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/3dab5b0ce203bcc03891122aca73da5c7342a40b"><code>3dab5b0</code></a> (builder) - minio: create bucket error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/734fca6f371bf73d79d35f1fcdc04ff66cb196fc"><code>734fca6</code></a> (controller) - autoscale: Fix for autoscale on k8s-1.9+ without breaking manual scaling</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a7dcd1000965fae97bad4dc4b908741f856e2d2b"><code>a7dcd10</code></a> (controller) - controller: test pass</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/93f0f2eaa361386bf7775edcbc27c143a71f0dc7"><code>93f0f2e</code></a> (controller) - controller: fix migrations error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4724375b4319e1cbfa1a587e0e856d9eb9b6ac00"><code>4724375</code></a> (controller) - controller: fix test error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7bacf298db4e431c58e86cef028f99fffb5b349e"><code>7bacf29</code></a> (controller) - charts: fix clusterrole</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/90957f727cc883084ff1a81deaada4d62419f0a9"><code>90957f7</code></a> (controller) - pod: sort events error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/440b13edb6e5b9c9fa69f8b6c72f10329a4087d2"><code>440b13e</code></a> (controller) - controller: review table structure</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0a470a6ecffa1fa9d5ef2bb0a71b00ddefb84a1f"><code>0a470a6</code></a> (controller) - controller: bump tornado 5.1.1</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e39218b2216591b7d412baeee5c8e85a7209996d"><code>e39218b</code></a> (controller) - pynsq: no current event loop in thread</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1d8630e250c65051df90b22f023f0f95034f0cc1"><code>1d8630e</code></a> (controller) - tests: fix test_task.py run error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1ff120213ee452a570a1e23dff85ab3032704a30"><code>1ff1202</code></a> (controller) - controller: fix test case</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d8c0da319db0b559eb8c8b0c28280d7e70613da2"><code>d8c0da3</code></a> (controller) - settings: fix env name</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/6d8fd3605f54c5a3c7ce0d4e5164f772fa22a8ec"><code>6d8fd36</code></a> (database) - 003_restore_from_backup.sh: ignore script exit 1</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/e0394a9a6aa44a066df18b8ad3ddd21e9c9fa1c2"><code>e0394a9</code></a> (database) - minio: fix not bucket error</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/f35f2525602c90dbe397f56005206ed6abf6eb39"><code>f35f252</code></a> (database) - mc: fix create_bucket error</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/74d68865fb7502d04e74418cc2b6ef8316c45778"><code>74d6886</code></a> (database) - postgres: recovery mode not run</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/e50d0c105151dac43b2bbc5f4e316a47dd55e925"><code>e50d0c1</code></a> (dockerbuilder) - caddy: fix caddy not start</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f3bec7a8a63c586d19caa777b3fa4a7d0de112c7"><code>f3bec7a</code></a> (fluentd) - influxdb: fix influxdb host and port</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/bc19f27d1567281c5c1ae10b9072c9aad33e2013"><code>bc19f27</code></a> (fluentd) - charts: skipped value for daemon_environment: Not a table</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/338d6237ed76464fc47a6ca3d6f3d34927af6aa2"><code>338d623</code></a> (logger) - logger: logger not run in alpine</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/77883026f33f38aa9d01dd4d88298d162a9050e1"><code>7788302</code></a> (minio) - minio: bump minio version</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/619eed0426591646d5fa9e72b77391d6ac817946"><code>619eed0</code></a> (minio) - fix: use go mod replace dep</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/3b42122703b8bfa3203c8115b8d673f2081d2559"><code>3b42122</code></a> (monitor) - monitor: fix host error</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/67998eff2439c406db048a868f61ae9861268449"><code>67998ef</code></a> (monitor) - influxdb: replace drycc-monitor-influxapi to drycc-monitor-influx-api</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/2cc361cf42754562ffa5b6e7c2e14c065e2cd0f1"><code>2cc361c</code></a> (registry) - registry: fix test case</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/548297a7b97e8f28498fa51b50f9232d8c78053b"><code>548297a</code></a> (registry) - minio: fix not bucket error</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5412ddb1b956fad53d0c59a87c2158b6e014b05f"><code>5412ddb</code></a> (registry) - minio: create bucket error</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/d0d629e5a58d7e91421f2cd344029474e5c630d4"><code>d0d629e</code></a> (slugbuilder) - slugbuilder:fix normalize_storage path</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/d76ecbe4d4d05aeb23a566b2d3c929cca4e63e63"><code>d76ecbe</code></a> (slugbuilder) - slugbuilder: use v3 api</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/c505e182006dd8a734efa14fc851f15340d05929"><code>c505e18</code></a> (slugbuilder) - shellcheck: SC2039</li> +</ul> +<h4 id="style">Style<a class="td-heading-self-link" href="#style" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/c893a1771550c7728f697216b17e38da0f18ec3f"><code>c893a17</code></a> (builder) - builder: fmt code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bba5795cd3f3f36bf2a4b6d37661254143f60328"><code>bba5795</code></a> (controller) - controller: format code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d36082b6f0fbf46487e3fdc6aff0e7866f6462a7"><code>d36082b</code></a> (controller) - controller: fix pep8</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/66026f2f2110fca58f783b8844d9c5b7a794d1f4"><code>66026f2</code></a> (controller) - resource: standardize the naming of resource</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/03d7e2c8bfb120627ec13c4aa37ff7bc3074e88e"><code>03d7e2c</code></a> (controller) - servicecatalog: change servicecatalog to svcat</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/49dbb6d99655dd398978b273ce3fb29051a56cb7"><code>49dbb6d</code></a> (controller) - controller: flake8 upgrade</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/cbfc108b4f209dfbd088f260fe84399bdda5d502"><code>cbfc108</code></a> (monitor) - monitor: format charts and dashboard</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/ee85954d57ae9d19e6e2790090a6fcf1413e8b2d"><code>ee85954</code></a> (slugbuilder) - slugbuilder: use shellcheck</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/3afed2e3592173fcc3522d71dfdbdd45a8b70a01"><code>3afed2e</code></a> (slugbuilder) - docker: simplify dockerfile</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/36b7f688afcb9c8c81016fbbc7b8a3da9537911d"><code>36b7f68</code></a> (slugrunner) - docker: simplify dockerfile</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/61bb0ef367bdabdb3072473e1d639d723b2a8f08"><code>61bb0ef</code></a> (builder) - aws: upgrade aws sdk version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0f2e074b748b9f7067cadac63fb83684bc582272"><code>0f2e074</code></a> (builder) - chore: use go mode replace dep</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e9a2219c2d1c9303cd1a60d2e9bdc9e676f07348"><code>e9a2219</code></a> (builder) - builder: delete glide up</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/bb8c518645bcee82e6ab7782496799b6b82b9fd4"><code>bb8c518</code></a> (builder) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fa6d02f54af2daf51c1b08b4b7ad6a3be2425b45"><code>fa6d02f</code></a> (builder) - builder: upgrade go.sum</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9d61e8da908fae47c33a77c8547e80d1d6d3d812"><code>9d61e8d</code></a> (builder) - build: upgrade go.mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d763a984a800366eb2f6384fbf23c596342720fb"><code>d763a98</code></a> (builder) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d1bc1aae69b9b16859e11bfa18b1fa2b602bc686"><code>d1bc1aa</code></a> (builder) - pkg: upgrade to new drycc/pkg</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/02b1e98a3b208be80326adb85307663ef931adf6"><code>02b1e98</code></a> (builder) - builder: update go mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8e17d6579e022ce3574ee7582a1f48fc88bb5e95"><code>8e17d65</code></a> (builder) - builder: change alpine repositories</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f32b723ef49069ffeee6f2419e87b5450617df1e"><code>f32b723</code></a> (builder) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e33dc612d4910ad3b0e56fbb797a7d1dd609bf6d"><code>e33dc61</code></a> (builder) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/3ab4f1c4a587f58230c1c91670831a0927dc6dfb"><code>3ab4f1c</code></a> (builder) - builder: update controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/b2adfac62d24626a8dc5f2cf4d011c4610170e3a"><code>b2adfac</code></a> (builder) - heroku: remove heroku-16 support</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f429ac8fa76a4b59ed36ab9b1dc2bfee19d0be3e"><code>f429ac8</code></a> (builder) - builder: set GIT_LOCK_TIMEOUT to 30 minutes</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7197c833a68b1168ee4eba0ac16a6fb569f2066e"><code>7197c83</code></a> (builder) - go.mod:upgrade require pkg controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5f3e22dc87a55d9bd8fd3299f37be26b19c2350f"><code>5f3e22d</code></a> (controller) - deps: bump django from 1.11.21 to 1.11.22 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1db645af644946d8694234b0b7e1f22e762c5424"><code>1db645a</code></a> (controller) - deps: bump django from 1.11.22 to 1.11.23 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/fbe80677bc8fe7d19772a0bc002fb541106ef75d"><code>fbe8067</code></a> (controller) - deps: bump django from 1.11.23 to 1.11.29 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/537d667d5fd896eec054adda6185042d6492cbd1"><code>537d667</code></a> (controller) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a23c65b14ba90a60a6d57aa56a12f201ad7ba33b"><code>a23c65b</code></a> (controller) - deps: update all deps to the latest version</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/546337eced482db0b8e879ce8caaa322503f5f52"><code>546337e</code></a> (controller) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/06023f8b84897c4aeaa14fc45c6d35c16eeed1d7"><code>06023f8</code></a> (controller) - workflow-manager: del workflow-manager</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bba573609e25e87875ca40ccdef6e4dd4c8cfd1a"><code>bba5736</code></a> (controller) - controller: change cluster-issuer location</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6c436612923a18486982c268d1e23bbd42a3f9a7"><code>6c43661</code></a> (controller) - Certificatechange cluster-issuer location</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/39a47288e3e0bcf7bfa55768c6759ac94c416c33"><code>39a4728</code></a> (controller) - controller:change cluster-issuer location del controller-cluster-issuer.yaml</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9e96d3f9ccda7f8934628444e72e4959bafde91a"><code>9e96d3f</code></a> (controller) - Certificate:upgrade version cert-manager.io/v1alpha2</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8e68049a870b2277663bd0dc09430baa343a5881"><code>8e68049</code></a> (controller) - docker: use INDEX_URL replace index.docker.io</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8fda20583558fefcd239d5e2d6ae09c5c5f881a7"><code>8fda205</code></a> (controller) - cert_manager: change cert_manager_enabled to global</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6fefb6d00f8909d7269a9171af9db7ba016533c4"><code>6fefb6d</code></a> (controller) - charts: change platform_domain to global</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/064b2ad886b7782598a7f68925d5275ebd88bfd4"><code>064b2ad</code></a> (controller) - maintenance: remove maintenance support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b8797c98a1b2e01f835169ca7493fff508a3cf95"><code>b8797c9</code></a> (controller) - workflow: remove namespace</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1b20d7632a8ca8e4e9f0f6b1c98826af1d846008"><code>1b20d76</code></a> (controller) - quota: add kube quota config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d780075077cf9f9843ecf79ae36e569eec59cd3d"><code>d780075</code></a> (controller) - pod: add pod default resources support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d72c0817b582f050321396240bd4a6bad3bfb16"><code>3d72c08</code></a> (controller) - rename: rename ingress name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0aa6ab9cd277231420b1404b922601debe0aa89b"><code>0aa6ab9</code></a> (controller) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7533a65e78efd06ebe809712791c5399b85efcba"><code>7533a65</code></a> (controller) - heroku: remove heroku-16 support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e5a885d676f052ffdee6bc74e2fe0cffb85a1f86"><code>e5a885d</code></a> (controller) - controller:check mount volume path</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9014e74b5c0312014aa9d20cf9d6aff128f8022f"><code>9014e74</code></a> (controller) - test: optimization Dockerfile.test</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0b6ebb2f0e18f7e97ed2bb7b2c6008e3be7248f2"><code>0b6ebb2</code></a> (controller) - tasks: change apply_async parameters</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/835f009573d5643d271b6e558793b1c9ae1463da"><code>835f009</code></a> (controller) - wsgi: add tornado 6 support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/67a4ad7cbd50cd9de1214e8d4be27196e8077367"><code>67a4ad7</code></a> (controller) - utils: use threads replace asyncio</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a28949b093e9f4d73c798f24e41d1eaff0cc1cc2"><code>a28949b</code></a> (controller) - ldap: add AUTH_LDAP_USER_FLAGS_BY_GROUP</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a903209c062f3e275f97bc18dc1d2b9a17e1a826"><code>a903209</code></a> (controller) - charts: add custom controller environment variables support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e0e783ecb5e87bf68e83411cfd92f54916aa9931"><code>e0e783e</code></a> (controller) - ldap: change filter style</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d7608251c2f8938b8f5ee1edd0c7d0f371931826"><code>d760825</code></a> (controller) - scheduler: remove debug log</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a25928ee84e75a84c13c5402cc351e1ec6e3f151"><code>a25928e</code></a> (controller) - wsgi: remove a wsgi.py file</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7b2696e3ea066b59395b63d97fbad5a472d49b5b"><code>7b2696e</code></a> (controller) - log: disable nsq.client info log</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8d5c07b49ba4220ba7946a8bef1a22b1e8d78e47"><code>8d5c07b</code></a> (controller) - charts: add default environment</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/025f4a2ea96c883df3c35b961aaac2bdd9a5b4ea"><code>025f4a2</code></a> (controller) - controller: change quota name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ebda60ed125f49524169cb320c79c37d5adc2e6c"><code>ebda60e</code></a> (controller) - controller: review pvc code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8832ba952281c2a06dc98dfc6726e7f9e9207d81"><code>8832ba9</code></a> (controller) - controller: change status\binding model type and mount path check container_types</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7148d04c5f1223f06747fae9a33cb3787159ce9e"><code>7148d04</code></a> (controller) - controller: add overcommit cpu and ram support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4d2087cc9c783e5c2722fd446b64c7263b783001"><code>4d2087c</code></a> (controller) - limits: modify limits unit verification</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/af36970d90b9a8d95857052ab1c97b7727a01976"><code>af36970</code></a> (controller) - api: check cpu/memory range for api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/329355b6cdde8a382a5fe271f764cca747cd9444"><code>329355b</code></a> (controller) - volumes: modify the volume size</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9dfee0919449d13e11ec3cfe50a187ecd5de07b2"><code>9dfee09</code></a> (controller) - LimitRanges: modify the default limits</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5205bca582cd292fcfa7c0abb1bcc98c3dce05f1"><code>5205bca</code></a> (controller) - controller: improve the details of certificate</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/7ebecdfdca2de4936b67bc542053305f098db6d6"><code>7ebecdf</code></a> (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/6415e2ccacef3af313b4df2e7d0924797217238f"><code>6415e2c</code></a> (database) - postgres: upgrade to pg13</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/12e68062d48938c8619f94c30741af6fd2fee8e9"><code>12e6806</code></a> (database) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/d294509c192eb7e2f6f11aedad8aefff83fb8532"><code>d294509</code></a> (database) - minio: use canary minio test</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/1bad02e1768d4d54df61f7df3e54c81bd68e6c52"><code>1bad02e</code></a> (database) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/d51420bbde24cada100f764288c9bd165dbc9f31"><code>d51420b</code></a> (database) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/4133d05d8edec1f1ba2b995354dc98ae863a1da7"><code>4133d05</code></a> (dockerbuilder) - dockerbuilder: update caddy and kaniko</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/6b4dd18637b3a81a64c1be34a6d73832095c638d"><code>6b4dd18</code></a> (dockerbuilder) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/6df9b7c0bc4a22bca7ed2588a070868680382f68"><code>6df9b7c</code></a> (fluentd) - deps-dev: update rake requirement from ~&gt; 10.0 to ~&gt; 12.3</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/c2490f84d991ddfc588bded7e6afe9706e82f090"><code>c2490f8</code></a> (fluentd) - fluentd: upgrade fluentd</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/be4a56a12ce0c8a812b8922630122225532ac3fa"><code>be4a56a</code></a> (fluentd) - fluentd: add Gemfile.lock</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/2237f755e0123eb4138289648b5a0ee64bbd4183"><code>2237f75</code></a> (fluentd) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/c5740650bcb218c59676733c20f5765ae4cb905d"><code>c574065</code></a> (fluentd) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/52b8084cbaa5d0b8c8ca7014f94b596dca911708"><code>52b8084</code></a> (fluentd) - router: delete obsolete router code</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/3b3ccebeced1c4257c0c3ed1a70b7f18a8c6aa85"><code>3b3cceb</code></a> (fluentd) - fluentd: remove manifests dir</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/25c6702f8c1e1c5916b0544ccda64eced3451448"><code>25c6702</code></a> (fluentd) - nsqd: change var name</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/bd571be4178f69cb4bd7ee233440ca889ec5c601"><code>bd571be</code></a> (fluentd) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/72aa4e6b7fe5cb5ef784f894429e3f1e177e5c82"><code>72aa4e6</code></a> (fluentd) - influxdb: change influxdb service name</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/bd61903dd01aa61374a5f527f8ee85bc7820c042"><code>bd61903</code></a> (logger) - logger: use go mod replace dep</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/69c63a1bd602c9a5a68ef3b93d43b2dca161d495"><code>69c63a1</code></a> (logger) - logger: update go.mod</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/3aa9cd715568b46efa26025f25c73ce897436b4f"><code>3aa9cd7</code></a> (logger) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/f05849639ef8e34bacf9a55965ab3d7297df4cf7"><code>f058496</code></a> (logger) - nsqd: change var name</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6d9787cebb2e992de9743ac0544201b012b21094"><code>6d9787c</code></a> (logger) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/85ed307592a38ae80186f59bf31e504124013e07"><code>85ed307</code></a> (logger) - logger: standard naming</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/d88e7b65131e2fdaa7d4164a4d66793d89cc384d"><code>d88e7b6</code></a> (minio) - minio: update minio api to v7</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/43715d2dd30bc15f5564124e0e5e444ce7ca63c2"><code>43715d2</code></a> (minio) - minio: upgrade minio</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/0e1239b358ce3bde11a1401634f519b7e1c38156"><code>0e1239b</code></a> (minio) - minio: use docker.io replace quay.io</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/f7f047b506a0e6b30b7b88e916d67b1faaba8a52"><code>f7f047b</code></a> (minio) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/afa71289345ed311e603c8847188ccef40774869"><code>afa7128</code></a> (minio) - build: upgrade go.mod</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/aff2db5a41ae72b899f2fc9f70af96730ed16fdf"><code>aff2db5</code></a> (minio) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/4547f14617a76db897b71ef7451db92a832dff1e"><code>4547f14</code></a> (minio) - pkg: upgrade to new drycc/pkg</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/2769b85cbd316cb08da58753d6bae3946d32032a"><code>2769b85</code></a> (minio) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/35dde8df07fb96c4996ef8410780da48e1170e4a"><code>35dde8d</code></a> (monitor) - monitor: update grafana influxdb telegraf</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9e3a949734f326290dd752c636991cf2e1c962f9"><code>9e3a949</code></a> (monitor) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6af0432fe174769e9d44c03c264ad4a9ea5cee5f"><code>6af0432</code></a> (monitor) - workflow-manager: remove workflow-manager</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/0611c07996da19eb1401278ad5cc5e46d3b1435c"><code>0611c07</code></a> (monitor) - router: delete obsolete router code</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/be048248577d97f8679863c179999ce843806c09"><code>be04824</code></a> (monitor) - cert_manager: change cert_manager_enabled to global</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/37801650414da8539390c4d7cad66f614b90ef6e"><code>3780165</code></a> (monitor) - charts: change platform_domain to global</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/50b04e15f9c3aa51751bb78250907fa22023a419"><code>50b04e1</code></a> (monitor) - influxdb: remove influxdb admin ui</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6ab4d68b758904d12697b9a129835e6d0474cafb"><code>6ab4d68</code></a> (monitor) - influxdb: remove unuse port</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f1510bd94e48ea41ff4c36ac2140688b5c2dde87"><code>f1510bd</code></a> (monitor) - monitor: update grafana dashboard,telegraf inputs.kubernetes</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f36de2c251dc63b21a1fdc2c05413d6d50e9f8cb"><code>f36de2c</code></a> (monitor) - pvc: upgrade to new format</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/fc78a0a2627b51a28c730e19f2c8c1c16103829f"><code>fc78a0a</code></a> (monitor) - workflow: remove namespace</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e85890f298dd68cf6c0e8af70d843e84da600361"><code>e85890f</code></a> (monitor) - monitor: monitoring nsqd and redis separately</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/694f6b1dc801769a8fe82b90ba26422747df6539"><code>694f6b1</code></a> (monitor) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/4aea36a822079ba593a646683dba0e35e3e68416"><code>4aea36a</code></a> (monitor) - grafana: add ldap support for grafana</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/68fc30f0f05af759b80e07c4dcd3d2a57c7ffd6a"><code>68fc30f</code></a> (nsqd) - nsq: update nsq</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/16f32aaf7b984b24853044b6619dbe9f2b8613e2"><code>16f32aa</code></a> (nsqd) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/04db389e01f6832a6a105a73a0a02c9b7dd6623b"><code>04db389</code></a> (redis) - reids: update to redis 6</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/3f01bab0dbe89fa4094750bdb5c3f0ac503b8f00"><code>3f01bab</code></a> (redis) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/647e4bed5f617727fd50c5e0645fd27cc128461e"><code>647e4be</code></a> (registry) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/0bbce990d4ff5660ce79020e0bca346a0c716b3d"><code>0bbce99</code></a> (registry) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/a982b503350abfd584d33d0e088bc0a79714fb9c"><code>a982b50</code></a> (registry) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/e088da3304147b568868e0546c321b57f84263b9"><code>e088da3</code></a> (registry-proxy) - ingress: renmae use_native_ingress to use_ingress</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7e88337bbfbc73bc30bd0906f25027c5d266b1c2"><code>7e88337</code></a> (registry-proxy) - nginx: upgrade nginx to mainline</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7204d72c00b2d7360a2d3a20833d701e303a9f62"><code>7204d72</code></a> (registry-proxy) - registry: optimizing variable naming</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/2eafc592dc68c529a8a3a8077ef9d48916718079"><code>2eafc59</code></a> (registry-proxy) - registry-proxy: update nginx</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/071bd86ae3bef755f47e22aad54762a7f1e4c0f1"><code>071bd86</code></a> (registry-proxy) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/c72db9618ee6a73655b4b2c5e940ee9fc9447380"><code>c72db96</code></a> (registry-proxy) - registry-proxy: change travis icon url</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/ca9f9623a6867f0c5f4ff973c06613deff9e5dd3"><code>ca9f962</code></a> (slugbuilder) - slugbuilder: del BUILDPACK_URL support</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/1b74dd57a7f19040577f8e55b6a9d993ef496c8d"><code>1b74dd5</code></a> (slugbuilder) - slugbuilder: add heroku-20 support</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/54d4ad2e97e9ff5c805ac985a0e5af0050677388"><code>54d4ad2</code></a> (slugbuilder) - slugbuilder: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/a78f37ee99cec1b7c3eb7cb7a803bf2a5ed7c45b"><code>a78f37e</code></a> (slugbuilder) - slugbuilder: add heroku-20 stack</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/94ac94ac5dd4a387c0e1aaef6638954e41e9983a"><code>94ac94a</code></a> (slugbuilder) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/53b4b8b7ef9dece421a7893c5c3137ab0df8b960"><code>53b4b8b</code></a> (slugbuilder) - slugbuilder: modify stack priority</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/58e2bd28cf5fda8c618a2ba540d9e3acbf46fab5"><code>58e2bd2</code></a> (slugbuilder) - dockerfile: add WORKDIR /tmp</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/b29cd04c1769ef3481ff7c61c41a6e8722664469"><code>b29cd04</code></a> (slugbuilder) - slugbuilder: add pre_build.sh</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/9d319f60a1edd735bc5217054fe365047bd8795a"><code>9d319f6</code></a> (slugbuilder) - slugbuilder: silent mc command output</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/d1ec3c983be9934dd6b86fa51200489eb5555fa7"><code>d1ec3c9</code></a> (slugbuilder) - heroku: remove heroku-16 support</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/5048534c684b76f41ca12136cefd6e6da51ace3e"><code>5048534</code></a> (slugbuilder) - slugbuilder: use drycc stack-images</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/a1165373fc9ca369eec2715a2a49f166430cefa9"><code>a116537</code></a> (slugrunner) - slugrunner: add heroku-20 support</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/a1196bf153c21cefde2122aee5bf7dfa32ac5f0a"><code>a1196bf</code></a> (slugrunner) - slugrunner: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/64c96d720f4b5cdc54b66d349bac6de5567ab331"><code>64c96d7</code></a> (slugrunner) - slugrunner: add heroku-20 stack</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/cc3e2264b67f950fb888502aeea08d41d4c8ccf4"><code>cc3e226</code></a> (slugrunner) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/9130bde01bcfa897ae5c4be6bc59b4a4fe7b92f3"><code>9130bde</code></a> (slugrunner) - shellcheck: shellcheck installer</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/4ea33e154ab4353de5bd5bf6afeb0157756224e8"><code>4ea33e1</code></a> (slugrunner) - slugrunner: modify stack priority</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/5514e8b393daa6f4cd8f3ebe0a619158e32945e6"><code>5514e8b</code></a> (slugrunner) - heroku: remove heroku-16 support</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/be829fb66e68bb9ccc2a1d49e1b364af09219fff"><code>be829fb</code></a> (slugrunner) - slugrunner: use drycc stack-images</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/e1e06be74f2f40740c8e72178ae6ba97233c5bbe"><code>e1e06be</code></a> (slugrunner) - slugrunner: remove Dockerfile.heroku-16</li> +</ul> + + + + + + Blog: Drycc Workflow v1.3.0 + /blog/2020/10/06/drycc-workflow-v1.3.0/ + Tue, 06 Oct 2020 00:00:00 +0000 + + /blog/2020/10/06/drycc-workflow-v1.3.0/ + + + + <p>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.</p> +<h2 id="workflow--v120---v130">Workflow ## v1.2.0 -&gt; v1.3.0<a class="td-heading-self-link" href="#workflow--v120---v130" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.0.2 -&gt; v1.1.0</li> +<li>slugbuilder v1.1.0 -&gt; v1.1.1</li> +<li>dockerbuilder v1.1.0 -&gt; v1.1.1</li> +<li>controller v1.2.0 -&gt; v1.2.1</li> +<li>slugrunner v1.1.0 -&gt; v1.1.1</li> +<li>database v1.0.0 -&gt; v1.0.1</li> +<li>fluentd v1.0.0 -&gt; v1.0.1</li> +<li>minio v1.0.0 -&gt; v1.0.1</li> +<li>monitor v1.0.0 -&gt; v1.0.1</li> +<li>registry v1.0.1 -&gt; v1.0.2</li> +<li>workflow-manager v1.0.0 -&gt; v1.0.1</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9c7cceb2b775850cbe30c6df7b03bdcf7a35d0d2"><code>9c7cceb</code></a> (builder) - builder: add app config to env</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7fe44faf2663b20e39b27221a8426cf332f2085b"><code>7fe44fa</code></a> (controller) - docker: docker timeout must be an int, float or None</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b196550f9ac51f22f422e29d6b1a7aa3708421c3"><code>b196550</code></a> (controller) - controller: revert release.check_image_access for now</li> +<li><a href="https://api.github.com/repos/drycc/workflow-manager/git/trees/cc3ec13a5d5173160f1f6b42726df81119cd69ae"><code>cc3ec13</code></a> (workflow-manager) - glide: bump goautoneg</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ef932c4eb4ea0d592b57f0a4aebdbd6ad039c998"><code>ef932c4</code></a> (builder) - controller-sdk-go: upgrade controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4654cf64a919aa64b10253b080e0b6aae86edcb5"><code>4654cf6</code></a> (controller) - django-rest-framework: upgrade to 3.9.3</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/14121f1dae135b137f8ded451cfd1d8f8ca62543"><code>14121f1</code></a> (controller) - deps: bump djangorestframework from 3.9.3 to 3.9.4 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/385acdc7e0359eedb83e10e71877a9ff591bff15"><code>385acdc</code></a> (controller) - deps: bump django from 1.11.20 to 1.11.21 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/fa312bb7f57f5f8638484bc4d9825aa962031a25"><code>fa312bb</code></a> (database) - postgres: set max_connections = 1024</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/7ebecdfdca2de4936b67bc542053305f098db6d6"><code>7ebecdf</code></a> (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/b8878f6d4c32540bc864581a457aa6c996e7e50c"><code>b8878f6</code></a> (dockerbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/b097451f312c0386c466be3b638242535849def0"><code>b097451</code></a> (fluentd) - fluent: upgrade fluent to v1.4</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/4341f9ae71b5dc55c14984d9cacc8e48a3e6e089"><code>4341f9a</code></a> (minio) - mc: upgrade mc and minio</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c1ee2a46808c6054ab1393cdd31bf861e01ebdfc"><code>c1ee2a4</code></a> (monitor) - monitor: remove copyrights.tar.gz</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/9854260ef4738be5d25e4a028ebd3125988fec34"><code>9854260</code></a> (registry) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/acc5627dd8f96d3f62e02cd8813cbd829321bd18"><code>acc5627</code></a> (slugbuilder) - slugbuilder: internal support for multi buildpack</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/d58907eb664185c25950953dae4fe4774a2f6310"><code>d58907e</code></a> (slugbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/b39a0c29fef7d76ae681ec7ba2f01e3605a33657"><code>b39a0c2</code></a> (slugrunner) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +</ul> + + + + + + Blog: Drycc Workflow v1.2.0 + /blog/2019/10/06/drycc-workflow-v1.2.0/ + Sun, 06 Oct 2019 00:00:00 +0000 + + /blog/2019/10/06/drycc-workflow-v1.2.0/ + + + + <p>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.</p> +<h2 id="workflow--v110---v120">Workflow ## v1.1.0 -&gt; v1.2.0<a class="td-heading-self-link" href="#workflow--v110---v120" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.0.1 -&gt; v1.0.2</li> +<li>slugbuilder v1.0.0 -&gt; v1.1.0</li> +<li>dockerbuilder v1.0.0 -&gt; v1.1.0</li> +<li>controller v1.1.0 -&gt; v1.2.0</li> +<li>slugrunner v1.0.0 -&gt; v1.1.0</li> +<li>registry v1.0.0 -&gt; v1.0.1</li> +<li>registry-proxy v1.0.1 -&gt; v1.0.2</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e5584e32ef02329fd091a7a4d3f40bac9894d5a4"><code>e5584e3</code></a> (controller) - controller: add STACK support</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/ad34dc1a501aada4aa2f8ceeb7eefa9fed6baf75"><code>ad34dc1</code></a> (dockerbuilder) - kaniko: use kaniko replace docker-py</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/b81430e8d7ac10167450667cf41e2f9efada6cca"><code>b81430e</code></a> (dockerbuilder) - dockerbuilder: change image to image.json format</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/60dde96064c69aa7578476c2e4855680f5186706"><code>60dde96</code></a> (slugbuilder) - slugbuilder: add STACK support</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/fe8b6e56dd1a9334844581183bb16eb3d59df366"><code>fe8b6e5</code></a> (slugrunner) - slugrunner: add STACK support</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/942f050ec90f771262cbb5634f5df8d5a3818a5d"><code>942f050</code></a> (builder) - registry: remove env DRYCC_REGISTRY_PROXY_PORT</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ff7a16f53ac78dac0c334a9718cdc76c65400732"><code>ff7a16f</code></a> (builder) - registry: remove ecr and gcr registry</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ad13683ce634c9b4835f45d2b474bac16ca52baa"><code>ad13683</code></a> (builder) - builder: change DRYCC_BUILD_TYPE to DRYCC_STACK</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/6def637d5331330940d0a94cf6313a4bcb67fec0"><code>6def637</code></a> (builder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5044e223a56ee6283ac8d68a1442a6430b18dd99"><code>5044e22</code></a> (builder) - registry: remove registry_secret_prefix</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2ea39cc0a9dd68fa1baca4b3725a00b9bcf7f89a"><code>2ea39cc</code></a> (builder) - controller-go-sdk: upgrade controller-go-sdk</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/6aee0d7f092b53c37c70d05db076eaae1bbcff44"><code>6aee0d7</code></a> (builder) - registry: optimizing variable naming</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f9c62d9db809bfe03af33092e71a16e56fc35483"><code>f9c62d9</code></a> (controller) - domain: added reserved domain check</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f5a135be6aa2b319e623fd59bb711705d1cfe13f"><code>f5a135b</code></a> (controller) - migrations: clean old migrations</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4369b2c2fb6ef861978588a61efa1bfc6a4572ec"><code>4369b2c</code></a> (controller) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1057ca59c3ae6bbd85d772f6b49b0c542d7d18c4"><code>1057ca5</code></a> (controller) - registry: remove registry_secret_prefix</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d114b3e93544624a5f01b1ca71db92d0b33f4e0d"><code>d114b3e</code></a> (controller) - docker: update docker client</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/edbe9631dcfb34ed50d9e931d36506fa262b6299"><code>edbe963</code></a> (dockerbuilder) - dockerfile: change base image to alpine</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/fb35baf913ff846e08ba79d9ad8195fca1411684"><code>fb35baf</code></a> (dockerbuilder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/946dbf688474933f821f641f6c027bab68cd9e79"><code>946dbf6</code></a> (dockerbuilder) - docker: remove insecure support</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/628d8532256e32a046268491f2a331dcb608b713"><code>628d853</code></a> (dockerbuilder) - proxy: add registry proxy</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ff27cbdd27e9dc51ce29b6a68777888ed8737862"><code>ff27cbd</code></a> (registry) - env: remove unused env</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7204d72c00b2d7360a2d3a20833d701e303a9f62"><code>7204d72</code></a> (registry-proxy) - registry: optimizing variable naming</li> +</ul> + + + + + + diff --git a/blog/releases/page/1/index.html b/blog/releases/page/1/index.html new file mode 100644 index 000000000..cc7d3d782 --- /dev/null +++ b/blog/releases/page/1/index.html @@ -0,0 +1,10 @@ + + + + /blog/releases/ + + + + + + diff --git a/blog/releases/page/2/index.html b/blog/releases/page/2/index.html new file mode 100644 index 000000000..90b1b46d3 --- /dev/null +++ b/blog/releases/page/2/index.html @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + +Release | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + +
+
Posts in 2019
+
    +
  • +
    +
    Drycc Workflow v1.2.0
    +

    06.10.2019 in Release

    + + + + + + +

    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. …

    +

    Read more

    +
    +
  • +
+ +
+
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 000000000..66d7af97d --- /dev/null +++ b/categories/index.html @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + +Categories | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+

Categories

+
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/categories/index.xml b/categories/index.xml new file mode 100644 index 000000000..1399e112a --- /dev/null +++ b/categories/index.xml @@ -0,0 +1,18 @@ + + + Drycc – Categories + /categories/ + Recent content in Categories on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + diff --git a/community/_print/index.html b/community/_print/index.html new file mode 100644 index 000000000..3acd002f6 --- /dev/null +++ b/community/_print/index.html @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + +Community | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+
+
+ +

Join the Drycc community

+

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.

+
+
+
+
+ + + +
+ + +
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/community/index.html b/community/index.html new file mode 100644 index 000000000..ed3583604 --- /dev/null +++ b/community/index.html @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + +Community | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+
+
+ +

Join the Drycc community

+

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.

+
+
+
+
+ + + +
+ + +
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/community/index.xml b/community/index.xml new file mode 100644 index 000000000..78e6f84bc --- /dev/null +++ b/community/index.xml @@ -0,0 +1,18 @@ + + + Drycc – Community + /community/ + Recent content in Community on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + diff --git a/css/prism.css b/css/prism.css new file mode 100644 index 000000000..716b70d6c --- /dev/null +++ b/css/prism.css @@ -0,0 +1,4 @@ +/* PrismJS 1.28.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+c+csharp+cpp+go+java+markdown+python+scss+sql+toml+yaml&plugins=toolbar+copy-to-clipboard */ +code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help} +div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none} diff --git a/docs/_print/index.html b/docs/_print/index.html new file mode 100644 index 000000000..bc573c444 --- /dev/null +++ b/docs/_print/index.html @@ -0,0 +1,10092 @@ + + + + + + + + + + + + + + + + + + + + + +Docs | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Docs

+ + + + + + + + +
+ + +
+

A Open, Unified, Lightweight, Simpler Containers as a Service (CaaS).

+ +
+ +

Welcome to Drycc

+

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.

+

Getting Started

+

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!

+ +
+
+ + + + + + + + + + + + + + + + +
+ +

1 - Quick Start

+
Step-by-step guides for deploying your first app and mastering the basics of Drycc.
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +

1.1 - Quick Start

+
This guide helps you set up the Drycc workflow.
+

Get started with Drycc Workflow in three easy steps.

+
    +
  1. Install CLI tools for Helm and Drycc Workflow
  2. +
  3. Boot a Kubernetes and install Drycc Workflow
  4. +
  5. Deploy your first application
  6. +
+

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.

+

Step 1: Install Workflow

+

For the quickstart we will install Drycc Workflow.

+

Step 2: Install CLI tools

+

For the quickstart we will install Drycc Workflow CLI.

+

Step 3: Deploy your first app

+

Last but not least, login and deploy your first application.

+ +
+ + + + + + + + + + + +
+ +

1.2 - Install Workflow

+
Install Workflow in pure host, it can be a cloud server, bare metal server, virtual machine, or even your laptop.
+

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.

+

Operating Systems

+

Drycc is expected to work on most modern Linux systems. Some OSS have specific requirements:

+
    +
  • (Red Hat/CentOS) Enterprise Linux, they usually use RPM package management.
  • +
  • Ubuntu (Desktop/Server/Cloud) Linux, a very popular distribution.
  • +
  • Debian GNU Linux, a very pure distribution of opensource software.
  • +
+

If you want to add more Linux distribution support, please submit a issue on github or submit PR directly.

+

System Software

+

Some basic software needs to be installed before installing drycc workflow.

+

OS configuration

+

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.

+

Installing NFSv4 client

+

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
+

Installing curl

+

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

+

Hardware requirements scale based on the size of your deployments. Minimum recommendations are outlined here.

+
    +
  • RAM: 1G Minimum (we recommend at least 2GB)
  • +
  • CPU: 1 Minimum
  • +
+

This configuration only contains the minimum requirements that can meet the operation.

+

Disk

+

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.

+

Domain Name

+

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
+

Install

+

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 -
+```
+
+

Install Node

+

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.

+
    +
  • First, check the cluster token of the master.
  • +
+
$ 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.

+
    +
  • Then, Set the environment variable:
  • +
+
$ 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
+```
+
+
    +
  • Join the cluster as server:
  • +
+
$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_server
+
    +
  • Join the cluster as agent:
  • +
+
$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_agent
+

Install Options

+

When using this method to install drycc, the following environment variables can be used to configure the installation:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ENVIRONMENT VARIABLEDESCRIPTION
PLATFORM_DOMAINRequired item, specify drycc’s domain name
DRYCC_ADMIN_USERNAMERequired item, specify drycc’s admin username
DRYCC_ADMIN_PASSWORDRequired item, specify drycc’s admin password
CERT_MANAGER_ENABLEDWhether to use automatic certificate. It is false by default
CHANNELBy default, stable channel will be installed. You can also specify testing
REGISTRY_FILEThe config.yaml file path used by k3s containers registry
KUBERNETES_SERVICE_HOSTSet with the HOST of the loadbalancer that was in front of kube-apiserver
KUBERNETES_SERVICE_PORTSet with the PORT of the loadbalancer that was in front of kube-apiserver
METALLB_CONFIG_FILEThe metallb config file path, layer 2 network is used by default
INSTALL_DRYCC_MIRRORSpecify the accelerated mirror location. Currently, only cn is supported
BUILDER_REPLICASNumber of builder replicas to deploy
CONTROLLER_API_REPLICASNumber of controller api replicas to deploy
CONTROLLER_CELERY_REPLICASNumber of controller celery replicas to deploy
CONTROLLER_WEBHOOK_REPLICASNumber of controller webhook replicas to deploy
CONTROLLER_APP_RUNTIME_CLASSRuntimeClass is a feature for selecting the container runtime configuration.
CONTROLLER_APP_STORAGE_CLASSStorageClass allocated by drycc volumes; default storageClass is used by default
REDIS_REPLICASNumber of redis replicas to deploy
REDIS_PERSISTENCE_SIZEThe size of the persistence space allocated to redis, which is 5Gi by default
REDIS_PERSISTENCE_STORAGE_CLASSStorangeClass of redis; default storangeclass is used by default
STORAGE_CSI_STATEFULSET_REPLICASNumber of storage csi controller replicas to deploy
STORAGE_MAINNODE_TIPD_REPLICASNumber of storage mainode tipd replicas to deploy
STORAGE_MAINNODE_TIPD_PERSISTENCE_SIZEThe size of the persistence space allocated to mainnode tipd, which is 10Gi by default
STORAGE_MAINNODE_TIPD_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode tipd; default storangeclass is used by default
STORAGE_MAINNODE_WEED_REPLICASNumber of storage mainode weed replicas to deploy
STORAGE_MAINNODE_WEED_PREALLOCATEPreallocate disk space for volumes, false is used by default
STORAGE_MAINNODE_WEED_SIZE_LIMIT_MBMaster stops directing writes to oversized volumes, 30000 is used by default
STORAGE_MAINNODE_WEED_DEFAULT_REPLICATIONdefault replication type if not specified, which is 000 by default
STORAGE_MAINNODE_WEED_PERSISTENCE_SIZEThe size of the persistence space allocated to mainnode weed, which is 10Gi by default
STORAGE_MAINNODE_WEED_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode weed; default storangeclass is used by default
STORAGE_METANODE_TIKV_REPLICASNumber of storage metanode tikv replicas to deploy
STORAGE_METANODE_TIKV_PERSISTENCE_SIZEThe size of the persistence space allocated to metanode tikv, which is 10Gi by default
STORAGE_METANODE_TIKV_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode tikv; default storangeclass is used by default
STORAGE_METANODE_WEED_REPLICASNumber of storage metanode weed replicas to deploy
STORAGE_METANODE_WEED_PERSISTENCE_SIZEThe size of the persistence space allocated to metanode weed, which is 10Gi by default
STORAGE_METANODE_WEED_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode weed; default storangeclass is used by default
STORAGE_DATANODE_WEED_REPLICASNumber of storage datanode weed replicas to deploy
STORAGE_DATANODE_WEED_PERSISTENCE_SIZEThe size of the persistence space allocated to datanode weed, which is 20Gi by default
STORAGE_DATANODE_WEED_PERSISTENCE_STORAGE_CLASSStorangeClass of datanode weed; default storangeclass is used by default
MONITOR_GRAFANA_PERSISTENCE_SIZEThe size of the persistence space allocated to monitor.grafana, which is 5Gi by default
MONITOR_GRAFANA_PERSISTENCE_STORAGE_CLASSStorangeClass of monitor grafana; default storangeclass is used by default
LOGGER_REPLICASNumber of logger replicas to deploy
RABBITMQ_REPLICASNumber of rabbitmq replicas to deploy
RABBITMQ_PERSISTENCE_SIZEThe size of the persistence space allocated to rabbitmq, which is 5Gi by default
RABBITMQ_PERSISTENCE_STORAGE_CLASSStorangeClass of rabbitmq; default storangeclass is used by default
DATABASE_REPLICASNumber of database replicas to deploy
DATABASE_PERSISTENCE_SIZEThe size of the persistence space allocated to database, which is 5Gi by default
DATABASE_PERSISTENCE_STORAGE_CLASSStorangeClass of database; default storangeclass is used by default
TIMESERIES_REPLICASNumber of timeseries replicas to deploy
TIMESERIES_PERSISTENCE_SIZEThe size of the persistence space allocated to timeseries, which is 5Gi by default
TIMESERIES_PERSISTENCE_STORAGE_CLASSStorangeClass of timeseries; default storangeclass is used by default
PASSPORT_REPLICASNumber of passport replicas to deploy
REGISTRY_REPLICASNumber of registry replicas to deploy
HELMBROKER_REPLICASNumber of helmbroker api replicas to deploy
HELMBROKER_CELERY_REPLICASNumber of helmbroker celery replicas to deploy
HELMBROKER_PERSISTENCE_SIZEThe size of the persistence space allocated to helmbroker, which is 5Gi by default
HELMBROKER_PERSISTENCE_STORAGE_CLASSStorangeClass of helmbroker; default storangeclass is used by default
PROMETHEUS_SERVER_RETENTIONPrometheus data retention period (default if not specified is 15 days)
PROMETHEUS_SERVER_PERSISTENCE_SIZEThe size of the persistence space allocated to prometheus-server, which is 10Gi by default
PROMETHEUS_SERVER_PERSISTENCE_STORAGE_CLASSStorangeClass of prometheus-server; default storangeclass is used by default
K3S_DATA_DIRThe config of k3s data dir; If not set, the default path is used
ACME_SERVERACME Server url, default use letsencrypt
ACME_EAB_KEY_IDThe key ID of which your external account binding is indexed by the external account
ACME_EAB_KEY_SECRETThe 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.

+

Uninstall

+

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 -
+
+
+ + + + + + + + + + + +
+ +

1.3 - Drycc Workflow Client CLI

+
How to download, install Drycc CLI tools.
+

Drycc Workflow Client CLI

+

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

+ +
+ + + + + + + + + + + +
+ +

1.4 - Deploy Your First App

+
Deploy an application using drycc cli.
+

Determine Your Host and Hostname Values

+

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.

+

Login to Workflow

+

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
+

Deploy an Application

+

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.

+

Change Application Configuration

+

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
+

Scale Your Application

+

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.

+

Going Further

+

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.

+ + +
+ + + + + + + + + + + + + + + +
+ +

2 - Understanding Workflow

+
Understanding the architecture design of workflow.
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +

2.1 - Concepts

+
Drycc Workflow is a lightweight application platform that deploys and scales Twelve-Factor apps as containers across a Kubernetes cluster.
+

Twelve-Factor Applications

+

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

+

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

+

[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.

+

Applications

+

Workflow is designed around the concept of an application, or app.

+

Applications come in one of three forms:

+
    +
  1. a collection of source files stored in a git repository
  2. +
  3. a Dockerfile and associated source files stored in a git repository
  4. +
  5. a reference to an existing image at a Container repository
  6. +
+

Applications 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.

+

Build, Release, Run

+

Git Push Workflow

+

Build Stage

+

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.

+

Release Stage

+

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.

+

Run Stage

+

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.

+

Backing Services

+

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.

+

See Also

+ + +
+ + + + + + + + + + + +
+ +

2.2 - Architecture

+
Drycc Workflow is built using a service oriented architecture.
+

All components are published as a set of container images which can be deployed to any +compliant Kubernetes cluster.

+

Overview

+

System Overview

+

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.

+

Platform Services

+

Workflow Overview

+

Drycc Workflow provides additional functionality to your Kubernetes cluster, including:

+ +

Kubernetes-Native

+

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.

+

Workflow and Kubernetes

+

Application Layout and Edge Routing

+

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.

+

Application Configuration

+

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.

+

Topologies

+

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.

+ +
+ + + + + + + + + + + +
+ +

2.3 - Components

+
Workflow is comprised of a number of small, independent services that combine to create a distributed CaaS.
+

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!

+

Controller

+

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.

+

Passport

+

Project Location: drycc/passport

+

The passport component exposes a web API and provide OAuth2 authentication.

+

Database

+

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.

+

Builder

+

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:

+
    +
  1. Receives incoming git push requests over SSH
  2. +
  3. Authenticates the user via SSH key fingerprint
  4. +
  5. Authorizes the user’s access to push code to the Application
  6. +
  7. Starts the Application Build phase (see below)
  8. +
  9. Triggers a new Release via the Controller
  10. +
+

Builder 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.

+

Object Storage

+

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.

+

Registry

+

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.

+

Logger: fluentbit, logger

+

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.

+

Monitor

+

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.

+

Prometheus

+

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.

+

Rabbitmq

+

Project Location: drycc/rabbitmq

+

RabbitMQ is the most widely deployed open source message broker. +Controller use celery with rabbitMQ to execute the asynchronous task.

+

HelmBroker

+

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.

+

Prometheus

+

Project Location: drycc/rabbitmq

+

Prometheus is an open-source systemsmonitoring and alerting toolkit originally built atSoundCloud.

+

See Also

+ + +
+ + + + + + + + + + + + + + + +
+ +

3 - Installing To Kubenetes

+
Deploying Drycc on a Kubernetes Cluster.
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +

3.1 - Requirements

+
To run Drycc Workflow on a Kubernetes cluster, there are a few requirements to keep in mind.
+

Kubernetes Versions

+

Drycc Workflow requires Kubernetes v1.16.15 or later.

+

Components Requirements

+

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.

+

Storage Requirements

+

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.

+

Resource Requirements

+

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:

+
    +
  • At least 4GB of RAM (more is better)
  • +
  • At least 40GB of hard disk space
  • +
+

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.

+ +
+ + + + + + + + + + + +
+ +

3.2 - Specify Gateway

+
Choose the gateway provider that best suits your needs and platform.
+

Install Drycc Workflow (Specify gateway)

+

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
+

Install a Kubernetes Gateway

+

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
+

Configure DNS

+

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.

+ + + + + + + + + + + + + + + +
NameTypeValue
*.drycc.ccA138.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.

+ +
+ + + + + + + + + + + +
+ +

3.3 - Installing Drycc Workflow

+
This document is aimed at those who have already provisioned a Kubernetes cluster and want to install Drycc Workflow.
+

If help is required getting started with Kubernetes and +Drycc Workflow, follow the quickstart guide for assistance.

+

Prerequisites

+
    +
  1. Verify the Kubernetes system requirements
  2. +
  3. Install Helm and Drycc Workflow CLI tools
  4. +
+

Check Your Setup

+

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"}
+

Choose Your Deployment Strategy

+

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:

+ +

Gateway

+

Now, workflow requires that gateway and cert-manager must be installed. Any compatible Kubernetes entry controller can be used.

+

Install Drycc Workflow

+

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.

+

Configure DNS

+

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.

+ + + + + + + + + + + + + + + +
NameTypeValue
drycc-builder.drycc.ccA138.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.

+ +
+ + + + + + + + + + + +
+ +

3.4 - Configuring Object Storage

+
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 Storage by default, which provides in-cluster.

+

Configuring off-cluster Object Storage

+

Every component that relies on object storage uses two inputs for configuration:

+
    +
  1. You must use object storage services that are compatible with S3 API
  2. +
  3. Access credentials stored as a Kubernetes secret named storage-creds
  4. +
+

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.

+

Step 1: Create storage buckets

+

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.

+

Step 2: Generate storage credentials

+

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!

+

Step 3: Configure Workflow Chart

+

Operators should configure object storage by editing the Helm values file before running helm install. To do so:

+
    +
  • Fetch the Helm values by running helm inspect values oci://registry.drycc.cc/charts/workflow > values.yaml
  • +
  • Update the global/storage parameter to reference the platform you are using, e.g. s3, azure, gcs, or swift
  • +
  • Find the corresponding section for your storage type and provide appropriate values including region, bucket names, and access credentials.
  • +
  • Save your changes.
  • +
+

!!! 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.

+ +
+ + + + + + + + + + + +
+ +

3.5 - Configuring Postgres

+
Drycc Workflow’s controller and passport component rely on a PostgreSQL database to store platform state.
+

Configuring Postgres

+

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.

+

Provisioning off-cluster Postgres

+

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:

+
    +
  1. The hostname or public IP of your PostgreSQL RDBMS
  2. +
  3. The port on which your PostgreSQL RDBMS runs– typically 5432
  4. +
+

Within the off-cluster RDBMS, manually provision the following:

+
    +
  1. A database user (take note of the username and password)
  2. +
  3. A database owned by that user (take note of its name)
  4. +
+

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
+

Configuring Workflow

+

The Helm chart for Drycc Workflow can be easily configured to connect the Workflow controller component to an off-cluster PostgreSQL database.

+
    +
  • Step 1: If you haven’t already fetched the values, do so with helm inspect values drycc/workflow > values.yaml
  • +
  • Step 2: Update database connection details by modifying values.yaml: +
      +
    • Update the databaseLocation parameter to off-cluster.
    • +
    • Update the values in the [database] configuration section to properly reflect all connection details.
    • +
    • Update the values in the [controller] configuration section to properly reflect platformDomain details.
    • +
    • Save your changes.
    • +
    • Note: you do not need to (and must not) base64 encode any values, as the Helm chart will automatically handle encoding as necessary.
    • +
    +
  • +
+

You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml as usual.

+ +
+ + + + + + + + + + + +
+ +

3.6 - Configuring Registry

+
Drycc Workflow’s builder component relies on a registry for storing application container images.
+

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.

+

Configuring Off-Cluster Private Registry

+

Every component that relies on a registry uses two inputs for configuration:

+
    +
  1. Registry Location environment variable named DRYCC_REGISTRY_LOCATION
  2. +
  3. Access credentials stored as a Kubernetes secret named registry-secret
  4. +
+

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:

+
    +
  1. off-cluster: Any provider which supports long-lived username/password authentication, such as Azure Container Registry, Docker Hub, quay.io, or a self-hosted Container registry.
  2. +
+

Configuration

+
    +
  1. If you haven’t already fetched the values file, do so with helm inspect values drycc/workflow > values.yaml
  2. +
  3. Update registry location details by modifying the values file: +* Update the 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.
  4. +
+

You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml using your desired registry.

+

Examples

+

Here we show how the relevant parts of the fetched values.yaml file might look like after configuring for a particular off-cluster registry:

+

Azure Container Registry (ACR)

+

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.

+

Quay.io

+
global:
+...
+  registryLocation: "off-cluster"
+...
+registry-token-refresher:
+...
+  registry:
+    hostname: "quay.io"
+    organization: "myorg"
+    username: "myusername"
+    password: "mypassword"
+...
+
+
+ + + + + + + + + + + + + + + +
+ +

4 - Users

+
In this tutorial, you’ll learn how to manage users.
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +

4.1 - Drycc Workflow CLI

+
How to download, install, and start using the Drycc CLI. The Drycc CLI used to be part of the Drycc Toolbelt.
+

The Drycc Workflow command-line interface (CLI), or client, allows you to interact +with Drycc Workflow.

+

Installation

+

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
+
+

Getting Help

+

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
+
+

Support for Multiple Profiles

+

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.

+
    +
  1. Path to a json configuration file.
  2. +
  3. Profile name. If you set profile to just a name, it will be saved alongside the default profile, +in $HOME/.drycc/<name>.json.
  4. +
+

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
+
+

Proxy Support

+

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.

+

CLI Plugins

+

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
+
+ +
+ + + + + + + + + + + +
+ +

4.2 - Users and Registration

+
Get started on Drycc today
+

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.

+

Login to Workflow

+

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 from Workflow

+

Logout of an existing controller session using drycc logout.

+
$ drycc logout
+Logged out as drycc
+
+

Verify Your Session

+

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.

+ +
+ + + + + + + + + + + +
+ +

4.3 - Users and SSH Keys

+
Create, manage, and upload SSH keys to Drycc for use in deploying and connecting to applications.
+

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.

+

Generate an SSH Key

+

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)
+

Adding and Removing SSH Keys

+

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
+
+
+ + + + + + + + + + + + + + + +
+ +

5 - Applications

+
A simple and scalable cloud platform for all developer needs.
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +

5.1 - Deploying an Application

+
Learn how to deploy the application to drycc.
+

An Application is deployed to Drycc using git push or the drycc client.

+

Supported Applications

+

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.

+

Login to the Controller

+

!!! 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
+

Select a Build Process

+

Drycc Workflow supports three different ways of building applications:

+

Buildpacks

+

Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.

+

Learn how to deploy applications using Buildpacks.

+

Dockerfiles

+

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.

+

Container Image

+

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.

+

Tuning Application Settings

+

It is possible to configure a few of the globally tunable settings on per application basis using config:set.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
DRYCC_DISABLE_CACHEif set, this will disable the [imagebuilder cache][] (default: not set)
DRYCC_DEPLOY_BATCHESthe number of pods to bring up and take down sequentially during a scale (default: number of available nodes)
DRYCC_DEPLOY_TIMEOUTdeploy timeout in seconds per deploy batch (default: 120)
IMAGE_PULL_POLICYthe kubernetes [image pull policy][pull-policy] for application images (default: “IfNotPresent”) (allowed values: “Always”, “IfNotPresent”)
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIThow many revisions Kubernetes keeps around of a given Deployment (default: all revisions)
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDShow many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30)
+

Deploy Timeout

+

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

+

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.

+

RC deploy

+

This deploy timeout defines how long to wait for each batch to complete in DRYCC_DEPLOY_BATCHES.

+

Additions to the base timeout

+

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.

+

Deployments

+

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.

+ +
+ + + + + + + + + + + +
+ +

5.2 - Using Buildpacks

+
An overview of buildpacks, which are responsible for transforming deployed code into a slug, which can then be executed on a container.
+

Drycc supports deploying applications via Cloud Native Buildpacks. Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.

+

Add SSH Key

+

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.

+

Prepare an Application

+

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
+
+

Create an Application

+

Use drycc create to create an application on the Controller.

+
$ drycc create
+Creating application... done, created skiing-keypunch
+Git remote drycc added
+
+

Push to Deploy

+

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.

+

Included Buildpacks

+

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.

+

Using a Custom Buildpack

+

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.

+

Using Private Repositories

+

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
+
+

Builder selector

+

Which way to build a project conforms to the following principles:

+
    +
  • If Dockerfile exists in the project, the stack uses container
  • +
  • If Procfile exists in the project, the stack uses buildpack
  • +
  • If both exist, container is used by default
  • +
  • You can also set the DRYCC_STACK to container or buildpack determine which stack to use.
  • +
+ +
+ + + + + + + + + + + +
+ +

5.3 - Using Dockerfiles

+
Drycc Container Registry allows you to deploy your Docker-based app to Drycc. Both Common Runtime and Private Spaces are supported.
+

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.

+

Add SSH Key

+

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.

+

Prepare an Application

+

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
+
+

Dockerfile Requirements

+

In order to deploy Dockerfile applications, they must conform to the following requirements:

+
    +
  • The Dockerfile must use the EXPOSE directive to expose exactly one port.
  • +
  • That port must be listening for an HTTP connection.
  • +
  • The Dockerfile must use the CMD directive to define the default process that will run within the container.
  • +
  • The Container image must contain bash to run processes.
  • +
+

!!! 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.

+

Create an Application

+

Use drycc create to create an application on the Controller.

+
$ drycc create
+Creating application... done, created folksy-offshoot
+Git remote drycc added
+
+

Push to Deploy

+

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.

+

Container Build Arguments

+

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
+
+
+ + + + + + + + + + + +
+ +

5.4 - Using Docker Images

+
Deploy an application using a container image stored in your Drycc Container Registry.
+

Drycc supports deploying applications via an existing Docker Image. +This is useful for integrating Drycc into Docker-based CI/CD pipelines.

+

Prepare an Application

+

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
+
+

Docker Image Requirements

+

In order to deploy Docker images, they must conform to the following requirements:

+
    +
  • The Dockerfile must use the EXPOSE directive to expose exactly one port.
  • +
  • That port must be listening for an HTTP connection.
  • +
  • The Dockerfile must use the CMD directive to define the default process that will run within the container.
  • +
  • The Docker image must contain bash to run processes.
  • +
+

!!! 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.

+

Create an Application

+

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.

+

Deploy the Application

+

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.

+

Private Registry

+

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:

+
    +
  • Gather the username and password for the registry, such as a Quay.io Robot Account or a GCR.io Long Lived Token
  • +
  • Run drycc registry:set username=<the-user> password=<secret> -a <application-name>
  • +
  • Now perform drycc pull as normal, against an image in the private registry
  • +
+

When 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.

+ +
+ + + + + + + + + + + +
+ +

5.5 - Managing Application Processes

+
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.
+

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.

+

Default Process Types

+

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.

+

Declaring Process Types

+

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
+

Scaling Processes

+

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

+

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.

+

Fetch a container logs of the application

+

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
+

Get a container info of the application

+

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 a container of the application

+

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
+

Get a Shell to a Running Container

+

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).

+

Restarting an Application Processes

+

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).

+

List an Application Process Types

+
$ 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    
+

Get deployment info of the application process type

+
$ 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  
+
+
+ + + + + + + + + + + +
+ +

5.6 - Configuring an Application

+
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.
+

Configuring an Application

+

A Drycc application stores config in environment variables.

+

Setting 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
+
+

Attach to Backing Services

+

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.

+

Buildpacks Cache

+

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.

+

Disabling and re-enabling 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.

+

Clearing 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
+
+

Custom Health Checks

+

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.

+

Autodeploy

+

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
+

Autorollback

+

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
+

Isolate the Application

+

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
+
+
+ + + + + + + + + + + +
+ +

5.7 - Managing Application Metrics

+
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.
+

Create an authentication token

+

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
+

Add scrape configurations for prometheus

+

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']
+
+
+ + + + + + + + + + + +
+ +

5.8 - Managing an Application

+
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.
+

Track Application Changes

+

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
+

Rollback a 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
+

Run One-off Administration Tasks

+

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
+
+

Share an Application

+

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
+

Application Troubleshooting

+

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
+
+ +
+ + + + + + + + + + + +
+ +

5.9 - Mounting volumes for an Application

+
Drycc supports many types of volumes. A container can use any number of volume types simultaneously.
+

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.
+
+

Create a volume for the application

+

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
+
+

List volumes in the application

+

After volume is created, you can list the volumes in this application.

+
$ drycc volumes:list
+=== scenic-icehouse volumes
+--- myvolumes     200M
+
+

Mount a volume

+

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
+
+

Use volume client to manage volume files.

+

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
+ +
+ + + + + + + + + + + +
+ +

5.10 - About gateway for an Application

+
A Gateway describes how traffic can be translated to Services within the cluster.
+

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.

+

Create Gateway for an Application

+

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     
+

Create service for an Application

+

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
+

Create Route for an Application

+

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
+
+
+ + + + + + + + + + + +
+ +

5.11 - Managing resources for an Application

+
Tools and services for developing, extending, and operating your app.
+

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.
+
+

List all available resource services

+

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
+
+

List all available plans for an resource services

+

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.
+
+

Create resource in application

+

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   
+
+

Bind resources

+

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
+
+

Describe resources

+

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
+
+

Update resources

+

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
+
+

Remove the resource

+

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
+
+ +
+ + + + + + + + + + + +
+ +

5.12 - Inter-app Communication

+
The Communication Solution between Drycc Applicatios.
+

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.

+

DNS Service Discovery

+

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”.

+ +
+ + + + + + + + + + + +
+ +

5.13 - Resource Limits

+
Drycc Workflow supports restricting memory and CPU shares of each process.
+

+

Managing Application Resource Limits

+

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.

+

Limiting

+

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
+
+
+ + + + + + + + + + + +
+ +

5.14 - Domains and Routing

+
Make your apps accessible via custom domain names.
+

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
+
+ +
+ + + + + + + + + + + +
+ +

5.15 - Application SSL Certificates

+
SSL is a cryptographic protocol that provides end-to-end encryption and integrity for all web requests.
+

Application SSL Certificates

+

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).

+

Overview

+

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:

+
    +
  1. Purchase an SSL certificate from your SSL provider
  2. +
  3. Upload the cert to Drycc
  4. +
+

Acquire SSL Certificate

+

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.

+

DNS and Domain Configuration

+

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 a Certificate

+

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.

+

Add a Certificate Chain

+

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
+
+

Attach SSL certificate to a domain

+

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
+
+

Endpoint overview

+

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
+
+

Testing SSL

+

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.

+

Enforcing SSL at the Router

+

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
+
+

Automated Certificate Management

+

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

+

Remove Certificate

+

You can remove a certificate using the certs:remove command:

+
$ drycc certs:remove my-cert -a foo
+Removing www.example.com... Done.
+
+

Swapping out certificates

+

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.

+

Troubleshooting

+

Here are some steps you can follow if your SSL endpoint is not working as you’d expect.

+

Untrusted Certificate

+

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.

+ +
+ + + + + + + + + + + +
+ +

5.16 - Using drycc.yaml

+
Drycc Container Registry allows you to deploy your Docker-based app to Drycc. Both Common Runtime and Private Spaces are supported.
+

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

+

drycc.yaml Overview

+

A manifest has three top-level sections.

+
    +
  • build – Specifies the to build Dockerfile
  • +
  • run – Specifies the release phase tasks to execute
  • +
  • deploy – Specifies process types and the commands to run for each type
  • +
+

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.

+ +
+ + + + + + + + + + + + + + + +
+ +

6 - Managing Workflow

+
Managing Workflow using the kubectl.
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +

6.1 - Tuning Component Settings

+
Helm Charts are a set of Kubernetes manifests that reflect best practices for deploying an application or service on Kubernetes.
+

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.

    +
  • +
+

Setting Resource limits

+

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"
+

Customizing the Builder

+

The following environment variables are tunable for the Builder component:

+ + + + + + + + + + + + + + + + + +
SettingDescription
DEBUGEnable debug log output (default: false)
BUILDER_POD_NODE_SELECTORA 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
+

Customizing the Controller

+

The following environment variables are tunable for the Controller component:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
REGISTRATION_MODEset registration to “enabled”, “disabled”, or “admin_only” (default: “admin_only”)
GUNICORN_WORKERSnumber of gunicorn workers spawned to process requests (default: CPU cores * 4 + 1)
RESERVED_NAMESa comma-separated list of names which applications cannot reserve for routing (default: “drycc, drycc-builder”)
DRYCC_DEPLOY_HOOK_URLSa comma-separated list of URLs to send deploy hooks to.
DRYCC_DEPLOY_HOOK_SECRET_KEYa private key used to compute the HMAC signature for deploy hooks.
DRYCC_DEPLOY_REJECT_IF_PROCFILE_MISSINGrejects 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_REMOVEwhen 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_TAGSset tags for all applications by default, for example: ‘{“role”: “worker”}’. (default: ‘’)
KUBERNETES_NAMESPACE_DEFAULT_QUOTA_SPECset 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)
+

LDAP authentication settings

+

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:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
LDAP_ENDPOINTThe URI of the LDAP server. If not specified, LDAP authentication is not enabled (default: “”, example: ldap://hostname).
LDAP_BIND_DNThe distinguished name to use when binding to the LDAP server (default: “”)
LDAP_BIND_PASSWORDThe password to use with LDAP_BIND_DN (default: “”)
LDAP_USER_BASEDNThe distinguished name of the search base for user names (default: “”)
LDAP_USER_FILTERThe name of the login field in the users search base (default: “username”)
LDAP_GROUP_BASEDNThe distinguished name of the search base for user’s groups names (default: “”)
LDAP_GROUP_FILTERThe filter for user’s groups (default: “”, example: objectClass=person)
+

Global and per application settings

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
DRYCC_DEPLOY_BATCHESthe number of pods to bring up and take down sequentially during a scale (default: number of available nodes)
DRYCC_DEPLOY_TIMEOUTdeploy timeout in seconds per deploy batch (default: 120)
IMAGE_PULL_POLICYthe kubernetes image pull policy for application images (default: “IfNotPresent”) (allowed values: “Always”, “IfNotPresent”)
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIThow many revisions Kubernetes keeps around of a given Deployment (default: all revisions)
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDShow 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.

+

Customizing the Database

+

The following environment variables are tunable for the Database component:

+ + + + + + + + + + + + + + + + + +
SettingDescription
BACKUP_FREQUENCYhow often the database should perform a base backup (default: “12h”)
BACKUPS_TO_RETAINnumber of base backups the backing store should retain (default: 5)
+

Customizing Fluentbit

+

The following values can be changed in the values.yaml file or by using the --values flag with the Helm CLI.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
KeyDescription
config.serviceThe service section defines the global properties of the service.
config.inputsAn input section defines a source (related to an input plugin).
config.filtersA filter section defines a filter (related to a filter plugin)
config.outputsThe 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.

+

Customizing the Logger

+

The following environment variables are tunable for the Logger component:

+ + + + + + + + + + + + + + + + + +
SettingDescription
STORAGE_ADAPTERHow to store logs that are sent to the logger. Legal values are “file”, “memory”, and “redis”. (default: “redis”)
NUMBER_OF_LINESHow many lines to store in the ring buffer (default: 1000)
+

Customizing the Monitor

+

Grafana

+

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:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDefault ValueDescription
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.

+

Telegraf

+

For a list of configuration values that can be set by using environment variables please see the following configuration file.

+

Prometheus

+

You can find a list of values that can be set using environment variables here.

+

Customizing the Registry

+

The Registry component can be tuned by following the +drycc/distribution config doc.

+

Customizing the Router

+

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:

+ + + + + + + + + + + + + +
SettingDescription
POD_NAMESPACEThe pod namespace the router resides in. This is set by the Kubernetes downward API.
+

Customizing Workflow Manager

+

The following environment variables are tunable for [Workflow Manager][]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
CHECK_VERSIONSEnables the external version check at https://versions.drycc.info/ (default: “true”)
POLL_INTERVAL_SECThe interval when Workflow Manager performs a version check, in seconds (default: 43200, or 12 hours)
VERSIONS_API_URLThe versions API URL (default: “https://versions-staging.drycc.info”)
DOCTOR_API_URLThe doctor API URL (default: “https://doctor-staging.drycc.info”)
API_VERSIONThe version number Workflow Manager sends to the versions API (default: “v2”)
+ +
+ + + + + + + + + + + +
+ +

6.2 - Configure DNS

+
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.
+

For example, assuming example.com were a cluster’s domain:

+
    +
  • The controller should be accessible at drycc.example.com
  • +
  • Applications should be accessible (by default) at <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.

+

With a Load Balancer

+

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:

+
    +
  • An A record enumerating each of your load balancer(s) IPs (i.e. DNS round-robining)
  • +
  • A CNAME record referencing an existing fully-qualified domain name for the load balancer +
      +
    • Per AWS’ own documentation, this is the recommended strategy when using AWS Elastic Load Balancers, as ELB IPs may change over time.
    • +
    +
  • +
+

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.

+

Without a Load Balancer

+

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.

+

Tutorial: Configuring DNS with Google Cloud DNS

+

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:

+
    +
  • Your Ingress service has a load balancer in front of it. +
      +
    • The load balancer need not be cloud based, it just needs to provide a stable IP address or a stable domain name
    • +
    +
  • +
  • You have the mystuff.com domain name registered with a registrar +
      +
    • Replace your domain name with mystuff.com in the instructions to follow
    • +
    +
  • +
  • Your registrar lets you alter the nameservers for your domain name (most registrars do)
  • +
+

Here are the steps for configuring cloud DNS to route to your drycc cluster:

+
    +
  1. Get the load balancer IP or domain name
  2. +
+
    +
  • If you are on Google Container Engine, you can run kubectl get svc -n istio-ingress and look for the LoadBalancer Ingress column to get the IP address
  • +
+
    +
  1. Create a new Cloud DNS Zone (on the console: Networking => Cloud DNS, then click on Create Zone)
  2. +
  3. Name your zone, and set the DNS name to mystuff.com. (note the . at the end
  4. +
  5. Click on the Create button
  6. +
  7. Click on the Add Record Set button on the resulting page
  8. +
  9. If your load balancer provides a stable IP address, enter the following fields in the resulting form:
  10. +
  11. DNS Name: *
  12. +
  13. Resource Record Type: A
  14. +
  15. 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 TTL
  16. +
  17. IPv4 Address: The IP that you got in the very first step
  18. +
  19. Click the Create button
  20. +
  21. If your load balancer provides the stable domain name lbdomain.com, enter the following fields in the resulting form:
  22. +
  23. DNS Name: *
  24. +
  25. Resource Record Type: CNAME
  26. +
  27. 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 TTL
  28. +
  29. Canonical name: lbdomain.com. (note the . a the end)
  30. +
  31. Click on the Create button
  32. +
  33. In your domain registrar, set the nameservers for your mystuff.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).
  34. +
+
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.

+

Testing

+

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."}
+
+
+ + + + + + + + + + + +
+ +

6.3 - Deploy Hooks

+
Deploy hooks allow an external service to receive a notification whenever a new version of your app is pushed to Workflow.
+

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.

+

HTTP POST Hook

+

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.

+ +
+ + + + + + + + + + + +
+ +

6.4 - Platform Logging

+
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.
+

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.

+

Configuring Off Cluster 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:

+
    +
  • db = “0”
  • +
  • host = “my.host.redis”
  • +
  • port = “6379”
  • +
  • password = ""
  • +
+

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.

+

Debugging Logger

+

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
+

Architecture Diagram

+
                        ┌────────┐                                        
+                        │ Router │                  ┌────────┐     ┌─────┐
+                        └────────┘                  │ Logger │◀───▶│Redis│
+                            │                       └────────┘     └─────┘
+                        Log file                        ▲                
+                            │                           │                
+                            ▼                           │                
+┌────────┐             ┌─────────┐    logs/metrics   ┌──────────────┐     
+│App Logs│──Log File──▶│Fluentbit│───────topics─────▶│ Redis Stream │     
+└────────┘             └─────────┘                   └──────────────┘     
+                                                                          
+

Default Configuration

+

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.

+ +
+ + + + + + + + + + + +
+ +

6.5 - Platform Monitoring

+
Platform monitoring to your apps to spot issues in advance and respond to incidents quickly.
+

Description

+

We now include a monitoring stack for introspection on a running Kubernetes cluster. The stack includes 4 components:

+ +

Architecture Diagram

+
┌────────────────┐                                                        
+│ HOST           │                                                        
+│  node-exporter │◀──┐                       ┌──────────────────┐         
+└────────────────┘   │                       │kube-state-metrics│         
+                     │                       └──────────────────┘         
+┌────────────────┐   │                               ▲                    
+│ HOST           │   │    ┌────────────┐             │                    
+│  node-exporter │◀──┼────│ Prometheus │─────────────┘                    
+└────────────────┘   │    └────────────┘                                  
+                     │          ▲                                         
+┌───────────────┐    │          │                                         
+│ HOST          │    │          ▼                                         
+│  node-exporter│◀───┘    ┌──────────┐                                    
+└───────────────┘         │ Grafana  │                                    
+                          └──────────┘                                    
+

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.

+

Production Configuration

+

A production install of Grafana should have the following configuration values changed if possible:

+
    +
  • Change the default username and password from 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.
  • +
  • Enable persistence
  • +
  • Use a supported external database such as mysql or postgres. You can find more information here
  • +
+

On Cluster Persistence

+

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
+

Off Cluster Grafana

+

If you wish to provide your own Grafana instance you can set grafanaLocation in the values.yaml file before running helm install.

+

Prometheus

+

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.

+

On Cluster Persistence

+

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
+

Off Cluster Prometheus

+

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"
  • +
+ +
+ + + + + + + + + + + +
+ +

6.6 - Production Deployments

+
When readying a Workflow deployment for production workloads, there are some additional recommendations.
+

Running Workflow without drycc storage

+

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:

+
    +
  • Removal of state from the worker nodes
  • +
  • Reduced resource usage
  • +
  • Reduced complexity and operational burden of managing Workflow
  • +
+

See Configuring Object Storage for details on removing this operational complexity.

+

Review Security Considerations

+

There are some additional security-related considerations when running Workflow in production. +See [Security Considerations][] for details.

+

Registration is Admin-Only

+

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:

+ +

Disable Grafana Signups

+

It is also recommended to disable signups for the Grafana dashboards.

+

Please see the following documentation to learn about disabling Grafana signups:

+ +

Running Workflow with RBAC

+

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:

+
    +
  • your Kubernetes cluster is in GKE
  • +
  • your Kubernetes cluster built with kubeadm
  • +
+

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.

+ +
+ + + + + + + + + + + +
+ +

6.7 - Upgrading Workflow

+
Drycc Workflow releases may be upgraded in-place with minimal downtime.
+

This upgrade process requires:

+ +

Upgrade Process

+

!!! 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.

+

Step 1: Apply the Workflow upgrade

+

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.

+

Step 2: Verify Upgrade

+

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
+

Step 3: Upgrade the Drycc Client

+

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)
+
+
+ + + + + + + + + + + + + + + +
+ +

7 - Troubleshooting

+
Troubleshooting is systematic approach to problem-solving.
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +

7.1 - Troubleshooting Workflow

+
Common issues that users have run into when provisioning Workflow are detailed below.
+

A Component Fails to Start

+

For information on troubleshooting a failing component, see +Troubleshooting with Kubectl.

+

An Application Fails to Start

+

For information on troubleshooting application deployment issues, see +Troubleshooting Applications.

+

Permission denied (publickey)

+

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.

+

Other Issues

+

Running into something not detailed here? Please open an issue or hop into +#community on Slack for help!

+ +
+ + + + + + + + + + + +
+ +

7.2 - Troubleshooting using Kubectl

+
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 use kubectl to debug any issues with the cluster.

+

Diving into the Components

+

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)
+
+ +
+ + + + + + + + + + + +
+ +

7.3 - Troubleshooting Applications

+
This document describes how one can troubleshoot common issues when deploying or debugging an application that fails to start or deploy.
+

Application has a Dockerfile, but a Buildpack Deployment Occurs

+

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:

+
    +
  1. Are you deploying the correct project?
  2. +
  3. Are you pushing the correct git branch (git push drycc <branch>)?
  4. +
  5. Is the Dockerfile in the project’s root directory?
  6. +
  7. Have you committed the Dockerfile to the project?
  8. +
+

Application was Deployed, but is Failing to Start

+

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.

+ +
+ + + + + + + + + + + + + + + +
+ +

8 - Roadmap

+
Browse the ever-growing list of up-to-date, community driven roadmaps.
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +

8.1 - Planning Process

+
Drycc features a lightweight process that emphasizes openness and ensures every community member can be an integral part of planning for the future.
+

The Role of Maintainers

+

Maintainers lead the Drycc projects. Their duties include proposing the Roadmap, reviewing and integrating contributions and maintaining the vision of the project.

+

Open Roadmap

+

The Drycc Roadmap is a community document. While Maintainers propose the Roadmap, it gets discussed and refined in Release Planning Meetings.

+

Contributing to the Roadmap

+

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.

+

Release Milestones

+

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.

+

Release Planning Meetings

+

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.

+

Credits

+

Thanks to Amy Lindburg and our friends at Podman for their inspiration.

+ +
+ + + + + + + + + + + +
+ +

8.2 - Drycc Workflow Roadmap

+
Drycc roadmap is community driven and managed through GitHub.
+

Drycc Workflow Roadmap

+

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.

+

Interactive drycc run /bin/bash

+

Provide the ability for developers to launch an interactive terminal session in +their application environment.

+

Related issues:

+ +

Log Streaming

+

Stream application logs via drycc logs -f https://github.com/drycc/drycc/issues/465

+

Teams and Permissions

+

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:

+ +

Monitoring

+ +

Workflow Addons/Services

+

Developers should be able to quickly and easily provision application +dependencies using a services or addon abstraction. +https://github.com/drycc/drycc/issues/231

+

Inbound/Outbound Webhooks

+

Drycc Workflow should be able to send and receive webhooks from external +systems. Facilitating integration with third party services like GitHub, +Gitlab, Slack, Hipchat.

+ + +
+ + + + + + + + + + + +
+ +

8.3 - Releases

+
Drycc’s release model allows applications to record and roll back to previous versions.
+

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.

+

Components Release as Needed

+

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.

+

Workflow Releases Each Month

+

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.

+

Semantic Versioning

+

Drycc releases comply with semantic versioning, with the “public API” broadly +defined as:

+
    +
  • REST, gRPC, or other API that is network-accessible
  • +
  • Library or framework API intended for public use
  • +
  • “Pluggable” socket-level protocols users can redirect
  • +
  • CLI commands and output formats
  • +
+

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.

+

How to Release a Component

+

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.

+

Step 1: Update Code and Run the Release Tool

+

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
+

Step 2: Verify the Component is Available

+

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}
+

How to Release Workflow

+

Drycc Workflow integrates multiple component releases together with a Kubernetes Helm chart +deliverable. This section leads a maintainer through creating a Workflow release.

+

Step 1: Set Environment Variables

+

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
+

Step 2: Tag Supporting Repositories

+

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.

+

Step 3: Create Helm Chart

+

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.

+

Step 4: Manual Testing

+

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:

+
    +
  1. Create a component PR that fixes the bug.
  2. +
  3. Once the PR passes and is reviewed, merge it and do a new +component release
  4. +
  5. Trigger the same workflow-chart-stage job as mentioned in Step 3 to upload the newly-generated Workflow release candidate chart to staging.
  6. +
+

Step 5: Release the Chart

+

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.

+

Step 6: Assemble Master Changelog

+

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.

+

Step 7: Update Documentation

+

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.

+

Step 8: Close GitHub Milestones

+

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.

+

Step 9: Release Workflow CLI Stable

+

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)
+

Step 10: Let Everyone Know

+

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!

+ +
+ + + + + + + + + + + + + + + +
+ +

9 - Contribution Guidelines

+
This HowTo is for project maintainers who need a Contributing Guide for their project.
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +

9.1 - Contributor Overview

+
Interested in contributing to a Drycc project? There are lots of ways to help.
+

File Bugs & Enhancements

+

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.

+

Write Documentation

+

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.

+

Contribute Code

+

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.

+

Triage Issues

+

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.

+

Share your Experience

+

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.

+ +
+ + + + + + + + + + + +
+ +

9.2 - Design Documents

+
Before submitting a pull request which will significantly alter the behavior of any Drycc component.
+

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.

+

Goals

+

Design documents help ensure project contributors:

+
    +
  • Involve stakeholders as early as possible in a feature’s development
  • +
  • Ensure code changes accomplish the original motivations and design goals
  • +
  • Establish clear acceptance criteria for a feature or change
  • +
  • Enforce test-driven design methodology and automated test coverage
  • +
+

Contents

+

Design document issues should be named Design Doc: <change description> and contain the following sections:

+

Goal

+

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.

+

Code Changes

+

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.

+

Tests

+

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.

+

Approval

+

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.

+ +
+ + + + + + + + + + + +
+ +

9.3 - Development Environment

+
This document is for developers who are interested in working directly on the Drycc codebase.
+

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.

+

Prerequisites

+

In order to successfully compile and test Drycc binaries and build Container images of Drycc components, the following are required:

+
    +
  • git
  • +
  • Go 1.5 or later, with support for compiling to linux/amd64
  • +
  • glide
  • +
  • golint
  • +
  • shellcheck
  • +
  • Podman (in a non-Linux environment, you will additionally want [Podman Machine][machine])
  • +
+

For drycc/controller, in particular, you will also need:

+
    +
  • Python 2.7 or later (with pip)
  • +
  • virtualenv (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.

+

Configuring Go

+

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.

+

Fork the Repository

+

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.

+

Alternative: Forking with a Pushurl

+

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.

+

Make Your Changes

+

With your development environment set up and the code you wish to work on forked and cloned, you can begin making your changes.

+

Test Your Changes

+

Drycc components each include a comprehensive suite of automated tests, mostly written in Go. See testing for instructions on running the tests.

+

Deploying Your Changes

+

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.

+

Running a Kubernetes Cluster for Development

+

To run a Kubernetes cluster locally or elsewhere to support your development activities, refer to Drycc installation instructions here.

+

Using a Development Registry

+

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.

+

Dev / Deployment Workflow

+

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:

+
    +
  1. Update source code and commit your changes using git
  2. +
  3. Use make build to build a new Container image
  4. +
  5. Use make dev-release to generate Kubernetes manifest(s)
  6. +
  7. Use make deploy to restart the component using the updated manifest
  8. +
+

This can be shortened to a one-liner using just the deploy target:

+
$ make deploy
+

Useful Commands

+

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:

+

See All Drycc Pods

+
$ kubectl --namespace=drycc get pods
+

Describe a Pod

+

This is often useful for troubleshooting pods that are in pending or crashed states:

+
$ kubectl --namespace=drycc describe -f <pod name>
+

Tail Logs

+
$ kubectl --namespace=drycc logs -f <pod name>
+

Django Shell

+

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!

+

Pull Requests

+

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.

+ +
+ + + + + + + + + + + +
+ +

9.4 - Testing Drycc

+
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.
+

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.

+

Set Up the Environment

+

Successfully executing the unit and functional tests for any Drycc component requires that the Development Environment is set up first.

+

Run the Tests

+

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.

+ +
+ + + + + + + + + + + +
+ +

9.5 - Submitting a Pull Request

+
Proposed changes to Drycc projects are made as GitHub pull requests.
+

Design Document

+

Before opening a pull request, ensure your change also references a design document if the contribution is substantial. For more information, see Design Documents.

+

Single Issue

+

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.

+

Include Tests

+

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.

+

Include Docs

+

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.

+

Cross-repo commits

+

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
+

Code Standards

+

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.

+

Commit Style

+

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 -> feature
  • +
  • fix -> bug fix
  • +
  • docs -> documentation
  • +
  • style -> formatting
  • +
  • ref -> refactoring code
  • +
  • test -> adding missing tests
  • +
  • chore -> maintenance
  • +
+

The {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.

+

Merge Approval

+

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.

+ +
+ + + + + + + + + + + +
+ +

9.6 - Community

+
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.
+

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.

+

Open Source Bounties

+

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.

+ +
+ + + + + + + + + + + +
+ +

9.7 - Triaging Issues

+
Issue triage provides an important way to contribute to an open source project.
+

Triage helps ensure issues resolve quickly by:

+
    +
  • Describing the issue’s intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences an problem and what actions they took.
  • +
  • Giving a contributor the information they need before they commit to resolving an issue.
  • +
  • Lowering the issue count by preventing duplicate issues.
  • +
  • Streamlining the development process by preventing duplicate discussions.
  • +
+

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.

+

Ensure the Issue Contains Basic Information

+

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:

+
    +
  • the version(s) of Drycc this issue affects
  • +
  • a reproducible case if this is a bug
  • +
  • page URL if this is a docs issue or the name of a man page
  • +
+

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.

+

Classifying the Issue

+

An issue can have multiple of the following labels:

+

Issue Kind

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KindDescription
bugBugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate.
docsWriting documentation, man pages, articles, blogs, or other significant word-driven task.
enhancementEnhancements can drastically improve usability or performance of a component.
questionContains a user or contributor question requiring a response.
securitySecurity-related issues such as TLS encryption, network segregation, authn/authz features, etc.
+

Functional Area

+
    +
  • builder
  • +
  • cache
  • +
  • contrib and provisioning
  • +
  • client
  • +
  • controller
  • +
  • database
  • +
  • docs
  • +
  • kubernetes
  • +
  • registry
  • +
  • router
  • +
  • store (Ceph)
  • +
  • tests
  • +
+

Easy Fix

+

“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.

+

Prioritizing issues

+

When attached to a specific milestone, an issue can be attributed one of the following labels to indicate their degree of priority.

+ + + + + + + + + + + + + + + + + +
PriorityDescription
priority 0Urgent: Security, critical bugs, blocking issues. Drop everything and fix this today, then consider creating a patch release.
priority 1Serious: 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.

+ +
+ + + + + + + + + + + +
+ +

9.8 - Conduct

+
The Drycc community welcomes and encourages participation by everyone.
+

Conduct

+

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:

+
    +
  1. +

    Be welcoming, friendly, and patient.

    +
  2. +
  3. +

    Be considerate.

    +
  4. +
+

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.

+
    +
  1. Be respectful.
  2. +
+

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.

+
    +
  1. Be careful in the words that you choose.
  2. +
+

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.)

+ +
+ + + + + + + + + + + +
+ +

9.9 - Drycc Maintainers

+
This document serves to describe the leadership structure of the Drycc project, and list the current project maintainers.
+

What is a maintainer?

+

(Unabashedly stolen from the Podman project)

+

There are different types of maintainers, with different responsibilities, but +all maintainers have 3 things in common:

+
    +
  1. They share responsibility in the project’s success.
  2. +
  3. They have made a long-term, recurring time investment to improve the project.
  4. +
  5. They spend that time doing whatever needs to be done, not necessarily what +is the most interesting or fun.
  6. +
+

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 maintainers

+

Drycc has two groups of maintainers in addition to our beloved Benevolent Dictator for Life.

+

BDFL

+

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

+

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:

+
    +
  • Classify and respond to GitHub issues and review pull requests
  • +
  • Help to shape the Drycc roadmap and lead efforts to accomplish roadmap milestones
  • +
  • Participate actively in feature development and bug fixing
  • +
  • Answer questions and help users in the Drycc #community Slack channel
  • +
+

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

+

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.

+

Becoming a maintainer

+

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:

+
    +
  • Sustained contributions to the project over a period of time (usually months)
  • +
  • A willingness to help Drycc users on GitHub and in the Drycc #community Slack channel
  • +
  • A friendly attitude :)
  • +
+

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.

+ +
+ + + + + + + + + + + + + + + +
+ +

10 - Reference Guide

+
Reference gxwuide definition and meaning.
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +

10.1 - Creating a Self-Signed SSL Certificate

+
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.
+

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.

+

Prerequisites

+

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 XHomebrew: brew install openssl
Windowscomplete package .exe installed
Ubuntu Linuxapt-get install openssl
+

Generate Private Key and Certificate Signing Request

+

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 []:
+...
+
+

Generate SSL Certificate

+

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.

+ +
+ + + + + + + + + + + +
+ +

10.2 - Controller API v2.0

+
This is the v2.0 REST API for the Controller.
+

What’s New

+

New! format of POST /v2/apps/<app id>/run has changed.

+

Authentication

+

Register a New User

+

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": []
+}
+

Log in

+

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"}
+

Cancel Account

+

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
+

Regenerate Token

+
+

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"}
+

Change Password

+

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 the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+

Applications

+

List all Applications

+

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"
+        }
+    ]
+}
+

Create an Application

+

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"
+}
+

Destroy an Application

+

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
+

List Application Details

+

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"
+}
+

Update Application Details

+

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
+

Retrieve Application Logs

+

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"
+

Run one-off Commands

+
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"}
+

Certificates

+

List all Certificates

+

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"
+    }
+  ]
+}
+

Get Certificate Details

+

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"
+}
+

Create Certificate

+

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"
+}
+

Destroy a Certificate

+

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
+

Attach a Domain to a Certificate

+

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
+

Remove a Domain from a Certificate

+

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
+

Pods

+

List all Pods

+

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"
+        }
+    ]
+}
+

List all Pods by Type

+

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"
+        }
+    ]
+}
+

Restart All Pods

+

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"
+    }
+]
+

Restart Pods by Type

+

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"
+    }
+]
+

Restart Pods by Type and Name

+

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"
+    }
+]
+

Scale Pods

+

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
+

Configuration

+

List Application Configuration

+

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"
+}
+

Create new Config

+

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"
+}
+

Unset Config Variable

+

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"
+}
+

Domains

+

List Application Domains

+

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"
+        }
+    ]
+}
+

Add Domain

+

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"
+}
+

Remove Domain

+

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
+

Builds

+

List Application Builds

+

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"
+        }
+    ]
+}
+

Create Application Build

+

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"
+}
+

Releases

+

List Application Releases

+

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
+        }
+    ]
+}
+

List Release Details

+

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
+}
+

Rollback Release

+

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}
+

Keys

+

List Keys

+

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"
+        }
+    ]
+}
+

Add Key to User

+

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"
+}
+

Remove Key from User

+

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
+

Permissions

+

List Application Permissions

+
+

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"
+    ]
+}
+

Create Application Permission

+

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
+

Remove Application Permission

+

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
+

List Administrators

+

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
+        }
+    ]
+}
+

Grant User Administrative Privileges

+
+

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
+

Remove User’s Administrative Privileges

+
+

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
+

Users

+

List all users

+
+

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": []
+        }
+    ]
+}
+
+
+ + + + + + + + + + + +
+ +

10.3 - Controller API v2.1

+
This is the v2.1 REST API for the Controller.
+

What’s New

+

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.

+

Authentication

+

Register a New User

+

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": []
+}
+

Log in

+

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"}
+

Cancel Account

+

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
+

Regenerate Token

+
+

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"}
+

Change Password

+

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 the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+

Applications

+

List all Applications

+

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"
+        }
+    ]
+}
+

Create an Application

+

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"
+}
+

Destroy an Application

+

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
+

List Application Details

+

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"
+}
+

Update Application Details

+

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
+

Retrieve Application Logs

+

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"
+

Run one-off Commands

+
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"}
+

Certificates

+

List all Certificates

+

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"
+    }
+  ]
+}
+

Get Certificate Details

+

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"
+}
+

Create Certificate

+

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"
+}
+

Destroy a Certificate

+

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
+

Attach a Domain to a Certificate

+

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
+

Remove a Domain from a Certificate

+

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
+

Pods

+

List all Pods

+

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"
+        }
+    ]
+}
+

List all Pods by Type

+

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"
+        }
+    ]
+}
+

Restart All Pods

+

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"
+    }
+]
+

Restart Pods by Type

+

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"
+    }
+]
+

Restart Pods by Type and Name

+

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"
+    }
+]
+

Scale Pods

+

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
+

Configuration

+

List Application Configuration

+

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"
+}
+

Create new Config

+

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"
+}
+

Unset Config Variable

+

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"
+}
+

Domains

+

List Application Domains

+

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"
+        }
+    ]
+}
+

Add Domain

+

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"
+}
+

Remove Domain

+

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
+

Builds

+

List Application Builds

+

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"
+        }
+    ]
+}
+

Create Application Build

+

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"
+}
+

Releases

+

List Application Releases

+

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
+        }
+    ]
+}
+

List Release Details

+

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
+}
+

Rollback Release

+

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}
+

Keys

+

List Keys

+

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"
+        }
+    ]
+}
+

Add Key to User

+

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"
+}
+

Remove Key from User

+

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
+

Permissions

+

List Application Permissions

+
+

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"
+    ]
+}
+

Create Application Permission

+

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
+

Remove Application Permission

+

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
+

List Administrators

+

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
+        }
+    ]
+}
+

Grant User Administrative Privileges

+
+

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
+

Remove User’s Administrative Privileges

+
+

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
+

Users

+

List all users

+
+

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": []
+        }
+    ]
+}
+
+
+ + + + + + + + + + + +
+ +

10.4 - Controller API v2.2

+
This is the v2.2 REST API for the Controller.
+

What’s New

+

New! /v2/auth/whoami endpoint

+

Authentication

+

Register a New User

+

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": []
+}
+

Log in

+

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"}
+

Cancel Account

+

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
+

Who Am I

+

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": []
+}
+

Regenerate Token

+
+

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"}
+

Change Password

+

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 the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+

Applications

+

List all Applications

+

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"
+        }
+    ]
+}
+

Create an Application

+

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"
+}
+

Destroy an Application

+

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
+

List Application Details

+

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"
+}
+

Update Application Details

+

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
+

Retrieve Application Logs

+

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"
+

Run one-off Commands

+
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"}
+

Certificates

+

List all Certificates

+

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"
+    }
+  ]
+}
+

Get Certificate Details

+

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"
+}
+

Create Certificate

+

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"
+}
+

Destroy a Certificate

+

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
+

Attach a Domain to a Certificate

+

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
+

Remove a Domain from a Certificate

+

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
+

Pods

+

List all Pods

+

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"
+        }
+    ]
+}
+

List all Pods by Type

+

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"
+        }
+    ]
+}
+

Restart All Pods

+

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"
+    }
+]
+

Restart Pods by Type

+

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"
+    }
+]
+

Restart Pods by Type and Name

+

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"
+    }
+]
+

Scale Pods

+

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
+

Configuration

+

List Application Configuration

+

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"
+}
+

Create new Config

+

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"
+}
+

Unset Config Variable

+

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"
+}
+

Domains

+

List Application Domains

+

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"
+        }
+    ]
+}
+

Add Domain

+

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"
+}
+

Remove Domain

+

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
+

Builds

+

List Application Builds

+

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"
+        }
+    ]
+}
+

Create Application Build

+

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"
+}
+

Releases

+

List Application Releases

+

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
+        }
+    ]
+}
+

List Release Details

+

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
+}
+

Rollback Release

+

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}
+

Keys

+

List Keys

+

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"
+        }
+    ]
+}
+

Add Key to User

+

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"
+}
+

Remove Key from User

+

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
+

Permissions

+

List Application Permissions

+
+

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"
+    ]
+}
+

Create Application Permission

+

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
+

Remove Application Permission

+

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
+

List Administrators

+

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
+        }
+    ]
+}
+

Grant User Administrative Privileges

+
+

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
+

Remove User’s Administrative Privileges

+
+

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
+

Users

+

List all users

+
+

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": []
+        }
+    ]
+}
+
+
+ + + + + + + + + + + +
+ +

10.5 - Controller API v2.3

+
This is the v2.3 REST API for the Controller.
+

What’s New

+

New! /v2/apps/{name}/logs endpoint was fixed and no longer returns b'log data' and instead returns a normal string log data

+

Authentication

+

Register a New User

+

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": []
+}
+

Log in

+

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"}
+

Cancel Account

+

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
+

Who Am I

+

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": []
+}
+

Regenerate Token

+
+

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"}
+

Change Password

+

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 the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+

Applications

+

List all Applications

+

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"
+        }
+    ]
+}
+

Create an Application

+

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"
+}
+

Destroy an Application

+

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
+

List Application Details

+

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"
+}
+

Update Application Details

+

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
+

Retrieve Application Logs

+

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"
+

Run one-off Commands

+
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"}
+

Certificates

+

List all Certificates

+

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"
+    }
+  ]
+}
+

Get Certificate Details

+

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"
+}
+

Create Certificate

+

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"
+}
+

Destroy a Certificate

+

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
+

Attach a Domain to a Certificate

+

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
+

Remove a Domain from a Certificate

+

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
+

Enable or disable TLS

+

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"
+}
+

Get TLS status

+

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"
+}
+

Pods

+

List all Pods

+

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"
+        }
+    ]
+}
+

List all Pods by Type

+

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"
+        }
+    ]
+}
+

Restart All Pods

+

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"
+    }
+]
+

Restart Pods by Type

+

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"
+    }
+]
+

Restart Pods by Type and Name

+

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"
+    }
+]
+

Scale Pods

+

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
+

Configuration

+

List Application Configuration

+

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"
+}
+

Create new Config

+

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"
+}
+

Unset Config Variable

+

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"
+}
+

Domains

+

List Application Domains

+

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"
+        }
+    ]
+}
+

Add Domain

+

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"
+}
+

Remove Domain

+

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
+

Builds

+

List Application Builds

+

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"
+        }
+    ]
+}
+

Create Application Build

+

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"
+}
+

Releases

+

List Application Releases

+

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
+        }
+    ]
+}
+

List Release Details

+

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
+}
+

Rollback Release

+

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}
+

Keys

+

List Keys

+

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"
+        }
+    ]
+}
+

Add Key to User

+

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"
+}
+

Remove Key from User

+

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
+

Permissions

+

List Application Permissions

+
+

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"
+    ]
+}
+

Create Application Permission

+

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
+

Remove Application Permission

+

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
+

List Administrators

+

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
+        }
+    ]
+}
+

Grant User Administrative Privileges

+
+

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
+

Remove User’s Administrative Privileges

+
+

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
+

Users

+

List all users

+
+

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": []
+        }
+    ]
+}
+
+
+ + + + + + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/docs/applications/_print/index.html b/docs/applications/_print/index.html new file mode 100644 index 000000000..dc96d538f --- /dev/null +++ b/docs/applications/_print/index.html @@ -0,0 +1,1953 @@ + + + + + + + + + + + + + + + + + + + + + +Applications | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Applications

+
A simple and scalable cloud platform for all developer needs.
+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + +
+ +

1 - Deploying an Application

+
Learn how to deploy the application to drycc.
+

An Application is deployed to Drycc using git push or the drycc client.

+

Supported Applications

+

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.

+

Login to the Controller

+

!!! 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
+

Select a Build Process

+

Drycc Workflow supports three different ways of building applications:

+

Buildpacks

+

Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.

+

Learn how to deploy applications using Buildpacks.

+

Dockerfiles

+

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.

+

Container Image

+

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.

+

Tuning Application Settings

+

It is possible to configure a few of the globally tunable settings on per application basis using config:set.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
DRYCC_DISABLE_CACHEif set, this will disable the [imagebuilder cache][] (default: not set)
DRYCC_DEPLOY_BATCHESthe number of pods to bring up and take down sequentially during a scale (default: number of available nodes)
DRYCC_DEPLOY_TIMEOUTdeploy timeout in seconds per deploy batch (default: 120)
IMAGE_PULL_POLICYthe kubernetes [image pull policy][pull-policy] for application images (default: “IfNotPresent”) (allowed values: “Always”, “IfNotPresent”)
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIThow many revisions Kubernetes keeps around of a given Deployment (default: all revisions)
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDShow many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30)
+

Deploy Timeout

+

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

+

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.

+

RC deploy

+

This deploy timeout defines how long to wait for each batch to complete in DRYCC_DEPLOY_BATCHES.

+

Additions to the base timeout

+

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.

+

Deployments

+

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.

+ +
+ + + + + + + + + + + +
+ +

2 - Using Buildpacks

+
An overview of buildpacks, which are responsible for transforming deployed code into a slug, which can then be executed on a container.
+

Drycc supports deploying applications via Cloud Native Buildpacks. Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.

+

Add SSH Key

+

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.

+

Prepare an Application

+

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
+
+

Create an Application

+

Use drycc create to create an application on the Controller.

+
$ drycc create
+Creating application... done, created skiing-keypunch
+Git remote drycc added
+
+

Push to Deploy

+

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.

+

Included Buildpacks

+

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.

+

Using a Custom Buildpack

+

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.

+

Using Private Repositories

+

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
+
+

Builder selector

+

Which way to build a project conforms to the following principles:

+
    +
  • If Dockerfile exists in the project, the stack uses container
  • +
  • If Procfile exists in the project, the stack uses buildpack
  • +
  • If both exist, container is used by default
  • +
  • You can also set the DRYCC_STACK to container or buildpack determine which stack to use.
  • +
+ +
+ + + + + + + + + + + +
+ +

3 - Using Dockerfiles

+
Drycc Container Registry allows you to deploy your Docker-based app to Drycc. Both Common Runtime and Private Spaces are supported.
+

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.

+

Add SSH Key

+

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.

+

Prepare an Application

+

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
+
+

Dockerfile Requirements

+

In order to deploy Dockerfile applications, they must conform to the following requirements:

+
    +
  • The Dockerfile must use the EXPOSE directive to expose exactly one port.
  • +
  • That port must be listening for an HTTP connection.
  • +
  • The Dockerfile must use the CMD directive to define the default process that will run within the container.
  • +
  • The Container image must contain bash to run processes.
  • +
+

!!! 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.

+

Create an Application

+

Use drycc create to create an application on the Controller.

+
$ drycc create
+Creating application... done, created folksy-offshoot
+Git remote drycc added
+
+

Push to Deploy

+

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.

+

Container Build Arguments

+

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
+
+
+ + + + + + + + + + + +
+ +

4 - Using Docker Images

+
Deploy an application using a container image stored in your Drycc Container Registry.
+

Drycc supports deploying applications via an existing Docker Image. +This is useful for integrating Drycc into Docker-based CI/CD pipelines.

+

Prepare an Application

+

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
+
+

Docker Image Requirements

+

In order to deploy Docker images, they must conform to the following requirements:

+
    +
  • The Dockerfile must use the EXPOSE directive to expose exactly one port.
  • +
  • That port must be listening for an HTTP connection.
  • +
  • The Dockerfile must use the CMD directive to define the default process that will run within the container.
  • +
  • The Docker image must contain bash to run processes.
  • +
+

!!! 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.

+

Create an Application

+

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.

+

Deploy the Application

+

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.

+

Private Registry

+

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:

+
    +
  • Gather the username and password for the registry, such as a Quay.io Robot Account or a GCR.io Long Lived Token
  • +
  • Run drycc registry:set username=<the-user> password=<secret> -a <application-name>
  • +
  • Now perform drycc pull as normal, against an image in the private registry
  • +
+

When 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.

+ +
+ + + + + + + + + + + +
+ +

5 - Managing Application Processes

+
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.
+

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.

+

Default Process Types

+

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.

+

Declaring Process Types

+

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
+

Scaling Processes

+

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

+

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.

+

Fetch a container logs of the application

+

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
+

Get a container info of the application

+

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 a container of the application

+

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
+

Get a Shell to a Running Container

+

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).

+

Restarting an Application Processes

+

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).

+

List an Application Process Types

+
$ 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    
+

Get deployment info of the application process type

+
$ 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  
+
+
+ + + + + + + + + + + +
+ +

6 - Configuring an Application

+
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.
+

Configuring an Application

+

A Drycc application stores config in environment variables.

+

Setting 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
+
+

Attach to Backing Services

+

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.

+

Buildpacks Cache

+

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.

+

Disabling and re-enabling 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.

+

Clearing 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
+
+

Custom Health Checks

+

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.

+

Autodeploy

+

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
+

Autorollback

+

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
+

Isolate the Application

+

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
+
+
+ + + + + + + + + + + +
+ +

7 - Managing Application Metrics

+
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.
+

Create an authentication token

+

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
+

Add scrape configurations for prometheus

+

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']
+
+
+ + + + + + + + + + + +
+ +

8 - Managing an Application

+
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.
+

Track Application Changes

+

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
+

Rollback a 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
+

Run One-off Administration Tasks

+

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
+
+

Share an Application

+

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
+

Application Troubleshooting

+

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
+
+ +
+ + + + + + + + + + + +
+ +

9 - Mounting volumes for an Application

+
Drycc supports many types of volumes. A container can use any number of volume types simultaneously.
+

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.
+
+

Create a volume for the application

+

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
+
+

List volumes in the application

+

After volume is created, you can list the volumes in this application.

+
$ drycc volumes:list
+=== scenic-icehouse volumes
+--- myvolumes     200M
+
+

Mount a volume

+

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
+
+

Use volume client to manage volume files.

+

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
+ +
+ + + + + + + + + + + +
+ +

10 - About gateway for an Application

+
A Gateway describes how traffic can be translated to Services within the cluster.
+

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.

+

Create Gateway for an Application

+

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     
+

Create service for an Application

+

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
+

Create Route for an Application

+

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
+
+
+ + + + + + + + + + + +
+ +

11 - Managing resources for an Application

+
Tools and services for developing, extending, and operating your app.
+

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.
+
+

List all available resource services

+

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
+
+

List all available plans for an resource services

+

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.
+
+

Create resource in application

+

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   
+
+

Bind resources

+

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
+
+

Describe resources

+

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
+
+

Update resources

+

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
+
+

Remove the resource

+

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
+
+ +
+ + + + + + + + + + + +
+ +

12 - Inter-app Communication

+
The Communication Solution between Drycc Applicatios.
+

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.

+

DNS Service Discovery

+

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”.

+ +
+ + + + + + + + + + + +
+ +

13 - Resource Limits

+
Drycc Workflow supports restricting memory and CPU shares of each process.
+

+

Managing Application Resource Limits

+

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.

+

Limiting

+

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
+
+
+ + + + + + + + + + + +
+ +

14 - Domains and Routing

+
Make your apps accessible via custom domain names.
+

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
+
+ +
+ + + + + + + + + + + +
+ +

15 - Application SSL Certificates

+
SSL is a cryptographic protocol that provides end-to-end encryption and integrity for all web requests.
+

Application SSL Certificates

+

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).

+

Overview

+

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:

+
    +
  1. Purchase an SSL certificate from your SSL provider
  2. +
  3. Upload the cert to Drycc
  4. +
+

Acquire SSL Certificate

+

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.

+

DNS and Domain Configuration

+

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 a Certificate

+

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.

+

Add a Certificate Chain

+

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
+
+

Attach SSL certificate to a domain

+

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
+
+

Endpoint overview

+

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
+
+

Testing SSL

+

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.

+

Enforcing SSL at the Router

+

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
+
+

Automated Certificate Management

+

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

+

Remove Certificate

+

You can remove a certificate using the certs:remove command:

+
$ drycc certs:remove my-cert -a foo
+Removing www.example.com... Done.
+
+

Swapping out certificates

+

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.

+

Troubleshooting

+

Here are some steps you can follow if your SSL endpoint is not working as you’d expect.

+

Untrusted Certificate

+

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.

+ +
+ + + + + + + + + + + +
+ +

16 - Using drycc.yaml

+
Drycc Container Registry allows you to deploy your Docker-based app to Drycc. Both Common Runtime and Private Spaces are supported.
+

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

+

drycc.yaml Overview

+

A manifest has three top-level sections.

+
    +
  • build – Specifies the to build Dockerfile
  • +
  • run – Specifies the release phase tasks to execute
  • +
  • deploy – Specifies process types and the commands to run for each type
  • +
+

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.

+ +
+ + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/docs/applications/deploying-apps/index.html b/docs/applications/deploying-apps/index.html new file mode 100644 index 000000000..06ba49711 --- /dev/null +++ b/docs/applications/deploying-apps/index.html @@ -0,0 +1,561 @@ + + + + + + + + + + + + + + + + + + + +Deploying an Application | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Deploying an Application

+
Learn how to deploy the application to drycc.
+ +

An Application is deployed to Drycc using git push or the drycc client.

+

Supported Applications

+

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.

+

Login to the Controller

+

!!! 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
+

Select a Build Process

+

Drycc Workflow supports three different ways of building applications:

+

Buildpacks

+

Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.

+

Learn how to deploy applications using Buildpacks.

+

Dockerfiles

+

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.

+

Container Image

+

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.

+

Tuning Application Settings

+

It is possible to configure a few of the globally tunable settings on per application basis using config:set.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
DRYCC_DISABLE_CACHEif set, this will disable the [imagebuilder cache][] (default: not set)
DRYCC_DEPLOY_BATCHESthe number of pods to bring up and take down sequentially during a scale (default: number of available nodes)
DRYCC_DEPLOY_TIMEOUTdeploy timeout in seconds per deploy batch (default: 120)
IMAGE_PULL_POLICYthe kubernetes [image pull policy][pull-policy] for application images (default: “IfNotPresent”) (allowed values: “Always”, “IfNotPresent”)
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIThow many revisions Kubernetes keeps around of a given Deployment (default: all revisions)
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDShow many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30)
+

Deploy Timeout

+

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

+

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.

+

RC deploy

+

This deploy timeout defines how long to wait for each batch to complete in DRYCC_DEPLOY_BATCHES.

+

Additions to the base timeout

+

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.

+

Deployments

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/domains-and-routing/index.html b/docs/applications/domains-and-routing/index.html new file mode 100644 index 000000000..62bc77f19 --- /dev/null +++ b/docs/applications/domains-and-routing/index.html @@ -0,0 +1,479 @@ + + + + + + + + + + + + + + + + + + + +Domains and Routing | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Domains and Routing

+
Make your apps accessible via custom domain names.
+ +

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
+
+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/index.html b/docs/applications/index.html new file mode 100644 index 000000000..515477ebc --- /dev/null +++ b/docs/applications/index.html @@ -0,0 +1,550 @@ + + + + + + + + + + + + + + + + + + + + + +Applications | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Applications

+
A simple and scalable cloud platform for all developer needs.
+ + +
+ + +
+
+
+ Deploying an Application +
+

Learn how to deploy the application to drycc.

+
+
+
+ Using Buildpacks +
+

An overview of buildpacks, which are responsible for transforming deployed code into a slug, which can then be executed on a container.

+
+
+
+ Using Dockerfiles +
+

Drycc Container Registry allows you to deploy your Docker-based app to Drycc. Both Common Runtime and Private Spaces are supported.

+
+
+
+ Using Docker Images +
+

Deploy an application using a container image stored in your Drycc Container Registry.

+
+
+
+ Managing Application Processes +
+

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.

+
+
+
+ Configuring an Application +
+

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.

+
+
+
+ Managing Application Metrics +
+

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.

+
+
+
+ Managing an Application +
+

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.

+
+
+
+ Mounting volumes for an Application +
+

Drycc supports many types of volumes. A container can use any number of volume types simultaneously.

+
+
+
+ About gateway for an Application +
+

A Gateway describes how traffic can be translated to Services within the cluster.

+
+
+
+ Managing resources for an Application +
+

Tools and services for developing, extending, and operating your app.

+
+
+
+ Inter-app Communication +
+

The Communication Solution between Drycc Applicatios.

+
+
+
+ Resource Limits +
+

Drycc Workflow supports restricting memory and CPU shares of each process.

+
+
+
+ Domains and Routing +
+

Make your apps accessible via custom domain names.

+
+
+
+ Application SSL Certificates +
+

SSL is a cryptographic protocol that provides end-to-end encryption and integrity for all web requests.

+
+
+
+ Using drycc.yaml +
+

Drycc Container Registry allows you to deploy your Docker-based app to Drycc. Both Common Runtime and Private Spaces are supported.

+
+
+ +
+ + + + + + +
+ +
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/index.xml b/docs/applications/index.xml new file mode 100644 index 000000000..4c27c55bb --- /dev/null +++ b/docs/applications/index.xml @@ -0,0 +1,1574 @@ + + + Drycc – Applications + /docs/applications/ + Recent content in Applications on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Docs: Deploying an Application + /docs/applications/deploying-apps/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/deploying-apps/ + + + + <p>An <a href="../reference-guide/terms.md#application">Application</a> is deployed to Drycc using <code>git push</code> or the <code>drycc</code> client.</p> +<h2 id="supported-applications">Supported Applications<a class="td-heading-self-link" href="#supported-applications" aria-label="Heading self-link"></a></h2> +<p>Drycc Workflow can deploy any application or service that can run inside a container. In order to be scaled +horizontally, applications must follow the <a href="http://12factor.net/">Twelve-Factor App</a> methodology and store any application state in external +backing services.</p> +<p>For example, if your application persists state to the local filesystem &ndash; common with content management systems like +Wordpress and Drupal &ndash; it cannot be scaled horizontally using <code>drycc scale</code>.</p> +<p>Fortunately, most modern applications feature a stateless application tier that can scale horizontally inside Drycc.</p> +<h2 id="login-to-the-controller">Login to the Controller<a class="td-heading-self-link" href="#login-to-the-controller" aria-label="Heading self-link"></a></h2> +<p>!!! important +if you haven&rsquo;t yet, now is a good time to <a href="/docs/users/cli/#installation">install the client</a> and <a href="/docs/users/registration/">register</a>.</p> +<p>Before deploying an application, users must first authenticate against the Drycc <a href="/docs/understanding-workflow/components/#controller">Controller</a> +using the URL supplied by their Drycc administrator.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Or you can login with username and password</p> +<pre tabindex="0"><code>$ drycc login http://drycc.example.com --username=demo --password=demo +Configuration file written to /root/.drycc/client.json +</code></pre><h2 id="select-a-build-process">Select a Build Process<a class="td-heading-self-link" href="#select-a-build-process" aria-label="Heading self-link"></a></h2> +<p>Drycc Workflow supports three different ways of building applications:</p> +<h3 id="buildpacks">Buildpacks<a class="td-heading-self-link" href="#buildpacks" aria-label="Heading self-link"></a></h3> +<p>Cloud Native Buildpacks are useful if you want to follow <a href="https://buildpacks.io/docs/">cnb&rsquo;s docs</a> for building applications.</p> +<p>Learn how to deploy applications <a href="/docs/applications/using-buildpacks/">using Buildpacks</a>.</p> +<h3 id="dockerfiles">Dockerfiles<a class="td-heading-self-link" href="#dockerfiles" aria-label="Heading self-link"></a></h3> +<p>Dockerfiles are a powerful way to define a portable execution environment built on a base OS of your choosing.</p> +<p>Learn how to deploy applications <a href="/docs/applications/using-dockerfiles/">using Dockerfiles</a>.</p> +<h3 id="container-image">Container Image<a class="td-heading-self-link" href="#container-image" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p>Learn how to deploy applications <a href="/docs/applications/using-container-images/">using Container images</a>.</p> +<h2 id="tuning-application-settings">Tuning Application Settings<a class="td-heading-self-link" href="#tuning-application-settings" aria-label="Heading self-link"></a></h2> +<p>It is possible to configure a few of the <a href="/docs/applications/managing-app-configuration/">globally tunable</a> settings on per application basis using <code>config:set</code>.</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>DRYCC_DISABLE_CACHE</td> +<td>if set, this will disable the [imagebuilder cache][] (default: not set)</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_BATCHES</td> +<td>the number of pods to bring up and take down sequentially during a scale (default: number of available nodes)</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_TIMEOUT</td> +<td>deploy timeout in seconds per deploy batch (default: 120)</td> +</tr> +<tr> +<td>IMAGE_PULL_POLICY</td> +<td>the kubernetes [image pull policy][pull-policy] for application images (default: &ldquo;IfNotPresent&rdquo;) (allowed values: &ldquo;Always&rdquo;, &ldquo;IfNotPresent&rdquo;)</td> +</tr> +<tr> +<td>KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT</td> +<td>how many <a href="http://kubernetes.io/docs/user-guide/deployments/#revision-history-limit">revisions</a> Kubernetes keeps around of a given Deployment (default: all revisions)</td> +</tr> +<tr> +<td>KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS</td> +<td>how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30)</td> +</tr> +</tbody> +</table> +<h3 id="deploy-timeout">Deploy Timeout<a class="td-heading-self-link" href="#deploy-timeout" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<h4 id="deployments">Deployments<a class="td-heading-self-link" href="#deployments" aria-label="Heading self-link"></a></h4> +<p>Deployments behave a little bit differently from the RC based deployment strategy.</p> +<p>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.</p> +<p>The base timeout is multiplied with <code>DRYCC_DEPLOY_BATCHES</code> to create an overall timeout. This would be 240 (timeout) * 4 (batches) = 960 second overall timeout.</p> +<h4 id="rc-deploy">RC deploy<a class="td-heading-self-link" href="#rc-deploy" aria-label="Heading self-link"></a></h4> +<p>This deploy timeout defines how long to wait for each batch to complete in <code>DRYCC_DEPLOY_BATCHES</code>.</p> +<h4 id="additions-to-the-base-timeout">Additions to the base timeout<a class="td-heading-self-link" href="#additions-to-the-base-timeout" aria-label="Heading self-link"></a></h4> +<p>The base timeout is extended as well with healthchecks using <code>initialDelaySeconds</code> on <code>liveness</code> and <code>readiness</code> 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.</p> +<h3 id="deployments-1">Deployments<a class="td-heading-self-link" href="#deployments-1" aria-label="Heading self-link"></a></h3> +<p>Workflow uses <a href="http://kubernetes.io/docs/user-guide/deployments/">Deployments</a> for deploys. In prior versions <a href="http://kubernetes.io/docs/user-guide/replication-controller/">ReplicationControllers</a> were used with the ability to turn on Deployments via <code>DRYCC_KUBERNETES_DEPLOYMENTS=1</code>.</p> +<p>The advantage of <a href="http://kubernetes.io/docs/user-guide/deployments/">Deployments</a> 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.</p> +<p>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.</p> +<p>Drycc Workflow will behave the same way with <code>DRYCC_KUBERNETES_DEPLOYMENTS</code> 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 <code>drycc ps:list</code> will output Pod names differently.</p> + + + + + + Docs: Using Buildpacks + /docs/applications/using-buildpacks/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/using-buildpacks/ + + + + <p>Drycc supports deploying applications via <a href="https://buildpacks.io/">Cloud Native Buildpacks</a>. Cloud Native Buildpacks are useful if you want to follow <a href="https://buildpacks.io/docs/">cnb&rsquo;s docs</a> for building applications.</p> +<h2 id="add-ssh-key">Add SSH Key<a class="td-heading-self-link" href="#add-ssh-key" aria-label="Heading self-link"></a></h2> +<p>For <strong>Buildpack</strong> based application deploys via <code>git push</code>, Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user.</p> +<ul> +<li> +<p>See <a href="/docs/users/ssh-keys/#generate-an-ssh-key">this document</a> for instructions on how to generate an SSH key.</p> +</li> +<li> +<p>Run <code>drycc keys:add</code> to upload your SSH key to Drycc Workflow.</p> +</li> +</ul> +<pre tabindex="0"><code>$ drycc keys:add ~/.ssh/id_drycc.pub +Uploading id_drycc.pub to drycc... done +</code></pre><p>Read more about adding/removing SSH Keys <a href="/docs/users/ssh-keys/#adding-and-removing-ssh-keys">here</a>.</p> +<h2 id="prepare-an-application">Prepare an Application<a class="td-heading-self-link" href="#prepare-an-application" aria-label="Heading self-link"></a></h2> +<p>If you do not have an existing application, you can clone an example application that demonstrates the Heroku Buildpack workflow.</p> +<pre><code>$ git clone https://github.com/drycc/example-go.git +$ cd example-go +</code></pre> +<h2 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h2> +<p>Use <code>drycc create</code> to create an application on the <a href="/docs/understanding-workflow/components/#controller">Controller</a>.</p> +<pre><code>$ drycc create +Creating application... done, created skiing-keypunch +Git remote drycc added +</code></pre> +<h2 id="push-to-deploy">Push to Deploy<a class="td-heading-self-link" href="#push-to-deploy" aria-label="Heading self-link"></a></h2> +<p>Use <code>git push drycc master</code> to deploy your application.</p> +<pre><code>$ 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: ---&gt; +Starting build... but first, coffee! +---&gt; Waiting podman running. +---&gt; Process podman started. +---&gt; Waiting caddy running. +---&gt; Process caddy started. +---&gt; Building pack +---&gt; 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 &quot;drycc/buildpacks&quot; using unqualified-search registries (/etc/containers/registries.conf) +Trying to pull registry.drycc.cc/drycc/buildpacks:bookworm... +Getting image source signatures +... +---&gt; Skip generate base layer +---&gt; Python Buildpack +---&gt; Downloading and extracting Python 3.10.0 +---&gt; 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&gt;=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&lt;4,&gt;=3.3.2 +Downloading asgiref-3.4.1-py3-none-any.whl (25 kB) +Requirement already satisfied: setuptools&gt;=3.0 in /layers/drycc_python/python/lib/python3.10/site-packages (from gunicorn==20.1.0-&gt;-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 +---&gt; 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 -&gt; master + +$ curl -s http://skiing-keypunch.example.com +Powered by Drycc +Release v2 on skiing-keypunch-v2-web-02zb9 +</code></pre> +<p>Because a Buildpacks-style application is detected, the <code>web</code> process type is automatically scaled to 1 on first deploy.</p> +<p>Use <code>drycc scale web=3</code> to increase <code>web</code> processes to 3, for example. Scaling a +process type directly changes the number of <a href="http://kubernetes.io/v1.1/docs/user-guide/pods.html">pods</a> running that process.</p> +<h2 id="included-buildpacks">Included Buildpacks<a class="td-heading-self-link" href="#included-buildpacks" aria-label="Heading self-link"></a></h2> +<p>For convenience, a number of buildpacks come bundled with Drycc:</p> +<ul> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/go">Go Buildpack</a></li> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/java">Java Buildpack</a></li> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/nodejs">Nodejs Buildpack</a></li> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/php">PHP Buildpack</a></li> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/python">Python Buildpack</a></li> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/ruby">Ruby Buildpack</a></li> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/rust">Rust Buildpack</a></li> +</ul> +<p>Drycc will cycle through the <code>bin/detect</code> script of each buildpack to match the code you +are pushing.</p> +<p>!!! note +If you&rsquo;re testing against the [Scala Buildpack][], the <a href="/docs/understanding-workflow/components/#builder">Builder</a> requires at least +512MB of free memory to execute the Scala Build Tool.</p> +<h2 id="using-a-custom-buildpack">Using a Custom Buildpack<a class="td-heading-self-link" href="#using-a-custom-buildpack" aria-label="Heading self-link"></a></h2> +<p>To use a custom buildpack, you need create a <code>.pack_builder</code> file in your root path app.</p> +<pre><code>$ tee &gt; .pack_builder &lt;&lt; EOF + &gt; registry.drycc.cc/drycc/buildpacks:bookworm + &gt; EOF +</code></pre> +<p>On your next <code>git push</code>, the custom buildpack will be used.</p> +<h2 id="using-private-repositories">Using Private Repositories<a class="td-heading-self-link" href="#using-private-repositories" aria-label="Heading self-link"></a></h2> +<p>To pull code from private repositories, set the <code>SSH_KEY</code> environment variable to a private key +which has access. Use either the path of a private key file or the raw key material:</p> +<pre><code>$ drycc config:set SSH_KEY=/home/user/.ssh/id_rsa +$ drycc config:set SSH_KEY=&quot;&quot;&quot;-----BEGIN RSA PRIVATE KEY----- +(...) +-----END RSA PRIVATE KEY-----&quot;&quot;&quot; +</code></pre> +<p>For example, to use a custom buildpack hosted at a private GitHub URL, ensure that an SSH public +key exists in your <a href="https://github.com/settings/ssh">GitHub settings</a>. Then set <code>SSH_KEY</code> to the corresponding SSH private key +and set <code>.pack_builder</code> to the builder image:</p> +<pre><code>$ tee &gt; .pack_builder &lt;&lt; EOF + &gt; registry.drycc.cc/drycc/buildpacks:bookworm + &gt; EOF +$ git add .buildpack +$ git commit -m &quot;chore(buildpack): modify the pack_builder&quot; +$ git push drycc master +</code></pre> +<h2 id="builder-selector">Builder selector<a class="td-heading-self-link" href="#builder-selector" aria-label="Heading self-link"></a></h2> +<p>Which way to build a project conforms to the following principles:</p> +<ul> +<li>If Dockerfile exists in the project, the stack uses <code>container</code></li> +<li>If Procfile exists in the project, the stack uses <code>buildpack</code></li> +<li>If both exist, <code>container</code> is used by default</li> +<li>You can also set the <code>DRYCC_STACK</code> to <code>container</code> or <code>buildpack</code> determine which stack to use.</li> +</ul> + + + + + + Docs: Using Dockerfiles + /docs/applications/using-dockerfiles/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/using-dockerfiles/ + + + + <p>Drycc supports deploying applications via Dockerfiles. A <a href="https://docs.docker.com/reference/builder/">Dockerfile</a> automates the steps for crafting a [Container Image][]. +Dockerfiles are incredibly powerful but require some extra work to define your exact application runtime environment.</p> +<h2 id="add-ssh-key">Add SSH Key<a class="td-heading-self-link" href="#add-ssh-key" aria-label="Heading self-link"></a></h2> +<p>For <strong>Dockerfile</strong> based application deploys via <code>git push</code>, Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user.</p> +<ul> +<li> +<p>See <a href="/docs/users/ssh-keys/#generate-an-ssh-key">this document</a> for instructions on how to generate an SSH key.</p> +</li> +<li> +<p>Run <code>drycc keys:add</code> to upload your SSH key to Drycc Workflow.</p> +</li> +</ul> +<pre tabindex="0"><code>$ drycc keys:add ~/.ssh/id_drycc.pub +Uploading id_drycc.pub to drycc... done +</code></pre><p>Read more about adding/removing SSH Keys <a href="/docs/users/ssh-keys/#adding-and-removing-ssh-keys">here</a>.</p> +<h2 id="prepare-an-application">Prepare an Application<a class="td-heading-self-link" href="#prepare-an-application" aria-label="Heading self-link"></a></h2> +<p>If you do not have an existing application, you can clone an example application that demonstrates the Dockerfile workflow.</p> +<pre><code>$ git clone https://github.com/drycc/helloworld.git +$ cd helloworld +</code></pre> +<h3 id="dockerfile-requirements">Dockerfile Requirements<a class="td-heading-self-link" href="#dockerfile-requirements" aria-label="Heading self-link"></a></h3> +<p>In order to deploy Dockerfile applications, they must conform to the following requirements:</p> +<ul> +<li>The Dockerfile must use the <code>EXPOSE</code> directive to expose exactly one port.</li> +<li>That port must be listening for an HTTP connection.</li> +<li>The Dockerfile must use the <code>CMD</code> directive to define the default process that will run within the container.</li> +<li>The Container image must contain <a href="https://www.gnu.org/software/bash/">bash</a> to run processes.</li> +</ul> +<p>!!! note +Note that if you are using a private registry of any kind (<code>gcr</code> or other) the application environment must include a <code>$PORT</code> config variable that matches the <code>EXPOSE</code>&rsquo;d port, example: <code>drycc config:set PORT=5000</code>. See <a href="/docs/installing-workflow/configuring-registry/#configuring-off-cluster-private-registry">Configuring Registry</a> for more info.</p> +<h2 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h2> +<p>Use <code>drycc create</code> to create an application on the <a href="/docs/understanding-workflow/components/#controller">Controller</a>.</p> +<pre><code>$ drycc create +Creating application... done, created folksy-offshoot +Git remote drycc added +</code></pre> +<h2 id="push-to-deploy">Push to Deploy<a class="td-heading-self-link" href="#push-to-deploy" aria-label="Heading self-link"></a></h2> +<p>Use <code>git push drycc master</code> to deploy your application.</p> +<pre><code>$ 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) +-----&gt; Building Docker image +Uploading context 4.096 kB +Uploading context +Step 0 : FROM drycc/base:latest + ---&gt; 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 + ---&gt; Using cache + ---&gt; cf9ef8c5caa7 +Step 2 : RUN tar -C /usr/local -xzf /tmp/go1.2.1.linux-amd64.tar.gz + ---&gt; Using cache + ---&gt; 515b1faf3bd8 +Step 3 : RUN mkdir -p /go + ---&gt; Using cache + ---&gt; ebf4927a00e9 +Step 4 : ENV GOPATH /go + ---&gt; Using cache + ---&gt; c6a276eded37 +Step 5 : ENV PATH /usr/local/go/bin:/go/bin:$PATH + ---&gt; Using cache + ---&gt; 2ba6f6c9f108 +Step 6 : ADD . /go/src/github.com/drycc/helloworld + ---&gt; 94ab7f4b977b +Removing intermediate container 171b7d9fdb34 +Step 7 : RUN cd /go/src/github.com/drycc/helloworld &amp;&amp; go install -v . + ---&gt; Running in 0c8fbb2d2812 +github.com/drycc/helloworld + ---&gt; 13b5af931393 +Removing intermediate container 0c8fbb2d2812 +Step 8 : ENV PORT 80 + ---&gt; Running in 9b07da36a272 + ---&gt; 2dce83167874 +Removing intermediate container 9b07da36a272 +Step 9 : CMD [&quot;/go/bin/helloworld&quot;] + ---&gt; Running in f7b215199940 + ---&gt; b1e55ce5195a +Removing intermediate container f7b215199940 +Step 10 : EXPOSE 80 + ---&gt; Running in 7eb8ec45dcb0 + ---&gt; ea1a8cc93ca3 +Removing intermediate container 7eb8ec45dcb0 +Successfully built ea1a8cc93ca3 +-----&gt; Pushing image to private registry + + Launching... done, v2 + +-----&gt; 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 -&gt; master + +$ curl -s http://folksy-offshoot.local3.dryccapp.com +Welcome to Drycc! +See the documentation at http://docs.drycc.cc/ for more information. +</code></pre> +<p>Because a Dockerfile application is detected, the <code>web</code> process type is automatically scaled to 1 on first deploy.</p> +<p>Use <code>drycc scale web=3</code> to increase <code>web</code> processes to 3, for example. Scaling a +process type directly changes the number of <a href="../reference-guide/terms.md#container">containers</a> +running that process.</p> +<h2 id="container-build-arguments">Container Build Arguments<a class="td-heading-self-link" href="#container-build-arguments" aria-label="Heading self-link"></a></h2> +<p>As of Workflow v2.13.0, users can inject their application config into the Container image using +<a href="https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables---build-arg">Container build arguments</a>. To opt into this, users must add a new environment variable +to their application:</p> +<pre tabindex="0"><code>$ drycc config:set DRYCC_DOCKER_BUILD_ARGS_ENABLED=1 +</code></pre><p>Every environment variable set with <code>drycc config:set</code> will then be available for use inside the +user&rsquo;s Dockerfile. For example, if a user runs <code>drycc config:set POWERED_BY=Workflow</code>, +the user can utilize that build argument in their Dockerfile:</p> +<pre tabindex="0"><code>ARG POWERED_BY +RUN echo &#34;Powered by $POWERED_BY&#34; &gt; /etc/motd +</code></pre> + + + + + Docs: Using Docker Images + /docs/applications/using-container-images/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/using-container-images/ + + + + <p>Drycc supports deploying applications via an existing <a href="https://docs.docker.com/introduction/understanding-docker/">Docker Image</a>. +This is useful for integrating Drycc into Docker-based CI/CD pipelines.</p> +<h2 id="prepare-an-application">Prepare an Application<a class="td-heading-self-link" href="#prepare-an-application" aria-label="Heading self-link"></a></h2> +<p>Start by cloning an example application:</p> +<pre><code>$ git clone https://github.com/drycc/example-dockerfile-http.git +$ cd example-dockerfile-http +</code></pre> +<p>Next use your local <code>docker</code> client to build the image and push +it to <a href="https://registry.hub.docker.com/">DockerHub</a>.</p> +<pre><code>$ docker build -t &lt;username&gt;/example-dockerfile-http . +$ docker push &lt;username&gt;/example-dockerfile-http +</code></pre> +<h3 id="docker-image-requirements">Docker Image Requirements<a class="td-heading-self-link" href="#docker-image-requirements" aria-label="Heading self-link"></a></h3> +<p>In order to deploy Docker images, they must conform to the following requirements:</p> +<ul> +<li>The Dockerfile must use the <code>EXPOSE</code> directive to expose exactly one port.</li> +<li>That port must be listening for an HTTP connection.</li> +<li>The Dockerfile must use the <code>CMD</code> directive to define the default process that will run within the container.</li> +<li>The Docker image must contain <a href="https://www.gnu.org/software/bash/">bash</a> to run processes.</li> +</ul> +<p>!!! note +Note that if you are using a private registry of any kind (<code>gcr</code> or other) the application environment must include a <code>$PORT</code> config variable that matches the <code>EXPOSE</code>&rsquo;d port, example: <code>drycc config:set PORT=5000</code>. See <a href="/docs/installing-workflow/configuring-registry/#configuring-off-cluster-private-registry">Configuring Registry</a> for more info.</p> +<h2 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h2> +<p>Use <code>drycc create</code> to create an application on the <a href="/docs/understanding-workflow/components/#controller">controller</a>.</p> +<pre><code>$ mkdir -p /tmp/example-dockerfile-http &amp;&amp; cd /tmp/example-dockerfile-http +$ drycc create example-dockerfile-http --no-remote +Creating application... done, created example-dockerfile-http +</code></pre> +<p>!!! note +For all commands except for <code>drycc create</code>, the <code>drycc</code> client uses the name of the current directory +as the app name if you don&rsquo;t specify it explicitly with <code>--app</code>.</p> +<h2 id="deploy-the-application">Deploy the Application<a class="td-heading-self-link" href="#deploy-the-application" aria-label="Heading self-link"></a></h2> +<p>Use <code>drycc pull</code> to deploy your application from <a href="https://registry.hub.docker.com/">DockerHub</a> or +a public registry.</p> +<pre><code>$ drycc pull &lt;username&gt;/example-dockerfile-http:latest +Creating build... done, v2 + +$ curl -s http://example-dockerfile-http.local3.dryccapp.com +Powered by Drycc +</code></pre> +<p>Because you are deploying a Docker image, the <code>web</code> process type is automatically scaled to 1 on first deploy.</p> +<p>Use <code>drycc scale web=3</code> to increase <code>web</code> processes to 3, for example. Scaling a +process type directly changes the number of <a href="../reference-guide/terms.md#container">Containers</a> +running that process.</p> +<h2 id="private-registry">Private Registry<a class="td-heading-self-link" href="#private-registry" aria-label="Heading self-link"></a></h2> +<p>To deploy Docker images from a private registry or from a private repository, use <code>drycc registry</code> +to attach credentials to your application. These credentials are the same as you&rsquo;d use when running +<code>docker login</code> at your private registry.</p> +<p>To deploy private Docker images, take the following steps:</p> +<ul> +<li>Gather the username and password for the registry, such as a <a href="https://docs.quay.io/glossary/robot-accounts.html">Quay.io Robot Account</a> or a <a href="https://cloud.google.com/container-registry/docs/auth#using_a_json_key_file">GCR.io Long Lived Token</a></li> +<li>Run <code>drycc registry:set username=&lt;the-user&gt; password=&lt;secret&gt; -a &lt;application-name&gt;</code></li> +<li>Now perform <code>drycc pull</code> as normal, against an image in the private registry</li> +</ul> +<p>When using a <a href="https://cloud.google.com/container-registry/docs/auth#using_a_json_key_file">GCR.io Long Lived Token</a>, the JSON blob will have to be compacted first using a +tool like <a href="https://stedolan.github.io/jq/">jq</a> and then used in the password field in <code>drycc registry:set</code>. For the username, use +<code>_json_key</code>. For example:</p> +<pre tabindex="0"><code>drycc registry:set username=_json_key password=&#34;$(cat google_cloud_cred.json | jq -c .)&#34; +</code></pre><p>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 <code>port</code> information can no longer be discovered. Instead the application <code>port</code> information can be set via +<code>drycc config:set PORT=80</code> prior to setting the registry information.</p> +<p>!!! note +Currently <a href="https://gcr.io">GCR.io</a> and <a href="https://aws.amazon.com/ecr/">ECR</a> in short lived auth token mode are not supported.</p> + + + + + + Docs: Managing Application Processes + /docs/applications/managing-app-processes/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/managing-app-processes/ + + + + <p>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.</p> +<p>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 <code>drycc scale &lt;ptype&gt;=&lt;n&gt;</code> to scale those +types accordingly.</p> +<h2 id="default-process-types">Default Process Types<a class="td-heading-self-link" href="#default-process-types" aria-label="Heading self-link"></a></h2> +<p>In the absence of a Procfile, a single, default process type is assumed for each application.</p> +<p>Applications built using <a href="/docs/applications/using-buildpacks/">Buildpacks</a> via <code>git push</code> implicitly receive a <code>web</code> process type, which starts +the application server. Rails 4, for example, has the following process type:</p> +<pre><code>web: bundle exec rails server -p $PORT +</code></pre> +<p>All applications utilizing <a href="/docs/applications/using-dockerfiles/">Dockerfiles</a> have an implied <code>web</code> process type, which runs the +Dockerfile&rsquo;s <code>CMD</code> directive unmodified:</p> +<pre><code>$ cat Dockerfile +FROM centos:latest +COPY . /app +WORKDIR /app +CMD python -m SimpleHTTPServer 5000 +EXPOSE 5000 +</code></pre> +<p>For the above Dockerfile-based application, the <code>web</code> process type would run the Container <code>CMD</code> of <code>python -m SimpleHTTPServer 5000</code>.</p> +<p>Applications utilizing <a href="/docs/applications/using-container-images/">remote Container images</a>, a <code>web</code> process type is also implied, and runs the <code>CMD</code> +specified in the Container image.</p> +<p>!!! note +The <code>web</code> 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.</p> +<h2 id="declaring-process-types">Declaring Process Types<a class="td-heading-self-link" href="#declaring-process-types" aria-label="Heading self-link"></a></h2> +<p>If you use <a href="/docs/applications/using-buildpacks/">Buildpack</a> or <a href="/docs/applications/using-dockerfiles/">Dockerfile</a> builds and want to override or specify additional process +types, simply include a file named <code>Procfile</code> in the root of your application&rsquo;s source tree.</p> +<p>The format of a <code>Procfile</code> is one process type per line, with each line containing the command to invoke:</p> +<pre><code>&lt;process type&gt;: &lt;command&gt; +</code></pre> +<p>The syntax is defined as:</p> +<ul> +<li><code>&lt;process type&gt;</code> – a lowercase alphanumeric string, is a name for your command, such as web, worker, urgentworker, clock, etc.</li> +<li><code>&lt;command&gt;</code> – a command line to launch the process, such as <code>rake jobs:work</code>.</li> +</ul> +<p>This example Procfile specifies two types, <code>web</code> and <code>sleeper</code>. The <code>web</code> process launches a web server on port 5000 and +a simple process which sleeps for 900 seconds and exits.</p> +<pre tabindex="0"><code>$ cat Procfile +web: bundle exec ruby web.rb -p ${PORT:-5000} +sleeper: sleep 900 +</code></pre><p>If you are using <a href="/docs/applications/using-container-images/">remote Container images</a>, you may define process types by either running <code>drycc pull</code> with a +<code>Procfile</code> in your working directory, or by passing a stringified Procfile to the <code>--procfile</code> CLI option.</p> +<p>For example, passing process types inline:</p> +<pre tabindex="0"><code>$ drycc pull drycc/example-go:latest --procfile=&#34;web: /app/bin/boot&#34; +</code></pre><p>Read a <code>Procfile</code> in another directory:</p> +<pre tabindex="0"><code>$ drycc pull drycc/example-go:latest --procfile=&#34;$(cat deploy/Procfile)&#34; +</code></pre><p>Or via a Procfile located in your current, working directory:</p> +<pre tabindex="0"><code>$ cat Procfile +web: /bin/boot +sleeper: echo &#34;sleeping&#34;; 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 +</code></pre><p>!!! note +Only process types of <code>web</code> will be scaled to 1 automatically. If you have additional process types +remember to scale the process counts after creation.</p> +<p>To remove a process type simply scale it to 0:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="scaling-processes">Scaling Processes<a class="td-heading-self-link" href="#scaling-processes" aria-label="Heading self-link"></a></h2> +<p>Applications deployed on Drycc Workflow scale out via the <a href="https://devcenter.heroku.com/articles/process-model">process model</a>. Use <code>drycc scale</code> to control the number of +<a href="../reference-guide/terms.md#container">containers</a> that power your app.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>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 <a href="/docs/applications/managing-app-processes/">Managing App Processes</a>.</p> +<p>In this example, we are scaling the process type <code>web</code> to 5 but leaving the process type <code>background</code> with one worker.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Scaling a process down, by reducing the process count, sends a <code>TERM</code> signal to the processes, followed by a <code>SIGKILL</code> +if they have not exited within 30 seconds. Depending on your application, scaling down may interrupt long-running HTTP +client connections.</p> +<p>For example, scaling from 5 processes to 3:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="autoscale">Autoscale<a class="td-heading-self-link" href="#autoscale" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>This feature is built on top of <a href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/">Horizontal Pod Autoscaling</a> in Kubernetes or <a href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/">HPA</a> for short.</p> +<p>!!! note +This is an alpha feature. It is recommended to be on the latest Kubernetes when using this feature.</p> +<pre tabindex="0"><code>$ drycc autoscale:set web --min=3 --max=8 --cpu-percent=75 +Applying autoscale settings for process type web on scenic-icehouse... done +</code></pre><p>And then review the scaling rule that was created for <code>web</code></p> +<pre tabindex="0"><code>$ drycc autoscale:list +PTYPE PERCENT MIN MAX +web 75 3 8 +</code></pre><p>Remove scaling rule</p> +<pre tabindex="0"><code>$ drycc autoscale:unset web +Removing autoscale for process type web on scenic-icehouse... done +</code></pre><p>For autoscaling to work CPU requests have to be specified on each application Pod (can be done via <code>drycc limits --cpu</code>). This allows the autoscale policies to do the <a href="https://github.com/kubernetes/community/blob/master/contributors/design-proposals/horizontal-pod-autoscaler.md#autoscaling-algorithm">appropriate calculations</a> and make decisions on when to scale up and down.</p> +<p>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 <a href="https://github.com/kubernetes/community/blob/master/contributors/design-proposals/horizontal-pod-autoscaler.md#autoscaling-algorithm">HPA algorithm page</a>.</p> +<h2 id="fetch-a-container-logs-of-the-application">Fetch a container logs of the application<a class="td-heading-self-link" href="#fetch-a-container-logs-of-the-application" aria-label="Heading self-link"></a></h2> +<p>List the containers:</p> +<pre tabindex="0"><code>$ 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) +</code></pre><p>fetch the container logs:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="get-a-container-info-of-the-application">Get a container info of the application<a class="td-heading-self-link" href="#get-a-container-info-of-the-application" aria-label="Heading self-link"></a></h2> +<p>List the containers:</p> +<pre tabindex="0"><code>$ 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: &#34;2024-05-24T07:14:39Z&#34; +Ready: true +Restart Count: 0 +</code></pre><h2 id="delete-a-container-of-the-application">delete a container of the application<a class="td-heading-self-link" href="#delete-a-container-of-the-application" aria-label="Heading self-link"></a></h2> +<p>Delete the containers. +Due to the set number of replicas, a new container will be launched to meet the quantity requirement.</p> +<pre tabindex="0"><code>$ drycc ps:delete python-getting-started-web-69b7d4bfdc-kl4xf +Deleting python-getting-started-web-69b7d4bfdc-kl4xf from python-getting-started... done +</code></pre><h2 id="get-a-shell-to-a-running-container">Get a Shell to a Running Container<a class="td-heading-self-link" href="#get-a-shell-to-a-running-container" aria-label="Heading self-link"></a></h2> +<p>Verify that the container is running:</p> +<pre tabindex="0"><code>$ 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) +</code></pre><p>Get a shell to the running container:</p> +<pre tabindex="0"><code>$ drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -it -- bash +</code></pre><p>In your shell, list the root directory:</p> +<pre tabindex="0"><code># Run this inside the container +ls / +</code></pre><p>Running individual commands in a container</p> +<pre tabindex="0"><code>$ drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -- date +</code></pre><p>Use &ldquo;drycc ps &ndash;help&rdquo; for a list of global command-line (applies to all commands).</p> +<h2 id="restarting-an-application-processes">Restarting an Application Processes<a class="td-heading-self-link" href="#restarting-an-application-processes" aria-label="Heading self-link"></a></h2> +<p>If you need to restart an application process, you may use <code>drycc pts:restart</code>. Behind the scenes, Drycc Workflow instructs +Kubernetes to terminate the old process and launch a new one in its place.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Notice that the process name has changed from <code>scenic-icehouse-background-3291896318-yf8kh</code> to +<code>scenic-icehouse-background-3291896318-yd87g</code>. In a multi-node Kubernetes cluster, this may also have the effect of scheduling +the Pod to a new node.</p> +<p>Use &ldquo;drycc pts &ndash;help&rdquo; for a list of pts command-line (process types info).</p> +<h2 id="list-an-application-process-types">List an Application Process Types<a class="td-heading-self-link" href="#list-an-application-process-types" aria-label="Heading self-link"></a></h2> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="get-deployment-info-of-the-application-process-type">Get deployment info of the application process type<a class="td-heading-self-link" href="#get-deployment-info-of-the-application-process-type" aria-label="Heading self-link"></a></h2> +<pre tabindex="0"><code>$ 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 +</code></pre> + + + + + Docs: Configuring an Application + /docs/applications/managing-app-configuration/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/managing-app-configuration/ + + + + <h1 id="configuring-an-application">Configuring an Application<a class="td-heading-self-link" href="#configuring-an-application" aria-label="Heading self-link"></a></h1> +<p>A Drycc application <a href="http://12factor.net/config">stores config in environment variables</a>.</p> +<h2 id="setting-environment-variables">Setting Environment Variables<a class="td-heading-self-link" href="#setting-environment-variables" aria-label="Heading self-link"></a></h2> +<p>Use <code>drycc config</code> to modify environment variables for a deployed application.</p> +<pre><code>$ 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. +</code></pre> +<p>When config is changed, a new release is created and deployed automatically.</p> +<p>You can set multiple environment variables with one <code>drycc config:set</code> command, +or with <code>drycc config:push</code> and a local .env file.</p> +<pre><code>$ drycc config:set FOO=1 BAR=baz &amp;&amp; drycc config:pull +$ cat .env +FOO=1 +BAR=baz +$ echo &quot;TIDE=high&quot; &gt;&gt; .env +$ drycc config:push +Creating config... done, v4 + +=== yuppie-earthman +DRYCC_APP: yuppie-earthman +FOO: 1 +BAR: baz +TIDE: high +</code></pre> +<p>It can also modify environment variables for a process type of application.</p> +<pre><code>$ drycc config:set FOO=1 BAR=baz --ptype=web +</code></pre> +<h2 id="attach-to-backing-services">Attach to Backing Services<a class="td-heading-self-link" href="#attach-to-backing-services" aria-label="Heading self-link"></a></h2> +<p>Drycc treats backing services like databases, caches and queues as <a href="http://12factor.net/backing-services">attached resources</a>. +Attachments are performed using environment variables.</p> +<p>For example, use <code>drycc config</code> to set a <code>DATABASE_URL</code> that attaches +the application to an external PostgreSQL database.</p> +<pre><code>$ drycc config:set DATABASE_URL=postgres://user:pass@example.com:5432/db +=== peachy-waxworks +DATABASE_URL: postgres://user:pass@example.com:5432/db +</code></pre> +<p>Detachments can be performed with <code>drycc config:unset</code>.</p> +<h2 id="buildpacks-cache">Buildpacks Cache<a class="td-heading-self-link" href="#buildpacks-cache" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<h3 id="disabling-and-re-enabling-the-cache">Disabling and re-enabling the cache<a class="td-heading-self-link" href="#disabling-and-re-enabling-the-cache" aria-label="Heading self-link"></a></h3> +<p>In some cases, cache might not speed up your application. To disable caching, you can set the +<code>DRYCC_DISABLE_CACHE</code> variable with <code>drycc config:set DRYCC_DISABLE_CACHE=1</code>. When you disable the +cache, Drycc will clear up files it created to store the cache. After having it turned off, run +<code>drycc config:unset DRYCC_DISABLE_CACHE</code> to re-enable the cache.</p> +<h3 id="clearing-the-cache">Clearing the cache<a class="td-heading-self-link" href="#clearing-the-cache" aria-label="Heading self-link"></a></h3> +<p>Use the following procedure to clear the cache:</p> +<pre><code>$ drycc config:set DRYCC_DISABLE_CACHE=1 +$ git commit --allow-empty -m &quot;Clearing Drycc cache&quot; +$ git push drycc # (if you use a different remote, you should use your remote name) +$ drycc config:unset DRYCC_DISABLE_CACHE +</code></pre> +<h2 id="custom-health-checks">Custom Health Checks<a class="td-heading-self-link" href="#custom-health-checks" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>The health checks are implemented as <a href="https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes">Kubernetes container probes</a>. A <code>liveness</code> +and a <code>readiness</code> probe can be configured, and each probe can be of type <code>httpGet</code>, <code>exec</code>, or +<code>tcpSocket</code> depending on the type of probe the container requires.</p> +<p>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.</p> +<p>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.</p> +<p><code>httpGet</code> 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.</p> +<p><code>exec</code> probes run a command inside the Container to determine its health, such as +<code>cat /var/run/myapp.pid</code> 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.</p> +<p><code>tcpSocket</code> probes attempt to open a socket in the Container. The Container is only considered +healthy if the check can establish a connection. <code>tcpSocket</code> probes accept a port number to perform +the socket connection on the Container.</p> +<p>Health checks can be configured on a per-proctype basis for each application using <code>drycc healthchecks:set</code>. If no type is mentioned then the health checks are applied to default proc type web, whichever is present. To +configure a <code>httpGet</code> liveness probe:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>If the application relies on certain headers being set (such as the <code>Host</code> header) or a specific +URL path relative to the root, you can also send specific HTTP headers:</p> +<pre tabindex="0"><code>$ drycc healthchecks:set liveness httpGet 80 \ + --path /welcome/index.html \ + --headers &#34;X-Client-Version:v1.0,X-Foo:bar&#34; +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 +</code></pre><p>To configure an <code>exec</code> readiness probe:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>You can overwrite a probe by running <code>drycc healthchecks:set</code> again:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>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.</p> +<h2 id="autodeploy">Autodeploy<a class="td-heading-self-link" href="#autodeploy" aria-label="Heading self-link"></a></h2> +<p>By default, Changes the config, limits or healthchecks and so on will trigger deploy. +If you don&rsquo;t want deploy, you can disable.</p> +<pre tabindex="0"><code>$ drycc autodeploy:disable +</code></pre><p>To re-enable autodeploy.</p> +<pre tabindex="0"><code>drycc autodeploy:enable +</code></pre><p>you can deploy by executing the following command. +deploy all ptypes</p> +<pre tabindex="0"><code>drycc releases:deploy +</code></pre><p>deploy web process type, and support <code>--force</code> option to force deploy.</p> +<pre tabindex="0"><code>drycc releases:deploy web --force +</code></pre><h2 id="autorollback">Autorollback<a class="td-heading-self-link" href="#autorollback" aria-label="Heading self-link"></a></h2> +<p>By default, deployment failures will roll back to the previous successful version. +If you don&rsquo;t want this to happen, you can disable.</p> +<pre tabindex="0"><code>$ drycc autorollback:disable +</code></pre><p>To re-enable autorollback.</p> +<pre tabindex="0"><code>drycc autorollback:enable +</code></pre><h2 id="isolate-the-application">Isolate the Application<a class="td-heading-self-link" href="#isolate-the-application" aria-label="Heading self-link"></a></h2> +<p>Workflow supports isolating applications onto a set of nodes using <code>drycc tags</code>.</p> +<p>!!! 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 <a href="http://kubernetes.io/docs/user-guide/node-selection/">&ldquo;Assigning Pods to Nodes&rdquo;</a>.</p> +<p>Once your nodes are configured with appropriate label selectors, use <code>drycc tags:set</code> to restrict +the application ptype to those nodes:</p> +<pre tabindex="0"><code>$ drycc tags:set web environ=prod +Applying tags... done, v4 + +environ prod +</code></pre> + + + + + Docs: Managing Application Metrics + /docs/applications/managing-app-metrics/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/managing-app-metrics/ + + + + <h2 id="create-an-authentication-token">Create an authentication token<a class="td-heading-self-link" href="#create-an-authentication-token" aria-label="Heading self-link"></a></h2> +<p>Create an authentication token using the drycc client.</p> +<pre tabindex="0"><code># drycc tokens:add prometheus --password admin --username admin + ! WARNING: Make sure to copy your token now. + ! You won&#39;t be able to see it again, please confirm whether to continue. + ! To proceed, type &#34;yes&#34; ! + +&gt; yes +UUID USERNAME TOKEN +58176cf1-37a8-4c52-9b27-4c7a47269dfb admin 1F2c7A802aF640fd9F31dD846AdDf56BcMsay +</code></pre><h2 id="add-scrape-configurations-for-prometheus">Add scrape configurations for prometheus<a class="td-heading-self-link" href="#add-scrape-configurations-for-prometheus" aria-label="Heading self-link"></a></h2> +<p>A valid example file can be found here.</p> +<p>The global configuration specifies parameters that are valid in all other configuration contexts. They also serve as defaults for other configuration sections.</p> +<pre tabindex="0"><code>global: + scrape_interval: 60s + evaluation_interval: 60s +scrape_configs: +- job_name: &#39;drycc&#39; + scheme: https + metrics_path: /v2/apps/&lt;appname&gt;/metrics + authorization: + type: Token + credentials: 1F2c7A802aF640fd9F31dD846AdDf56BcMsay + static_configs: + - targets: [&#39;drycc.domain.com&#39;] +</code></pre> + + + + + Docs: Managing an Application + /docs/applications/managing-app-lifecycle/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/managing-app-lifecycle/ + + + + <h2 id="track-application-changes">Track Application Changes<a class="td-heading-self-link" href="#track-application-changes" aria-label="Heading self-link"></a></h2> +<p>Drycc Workflow tracks all changes to your application. Application changes are the result of either new application code +pushed to the platform (via <code>git push drycc master</code>), or an update to application configuration (via <code>drycc config:set KEY=VAL</code>).</p> +<p>Each time a build or config change is made to your application a new <a href="../reference-guide/terms.md#release">release</a> is created. These release numbers +increase monotonically.</p> +<p>You can see a record of changes to your application using <code>drycc releases</code>:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="rollback-a-release">Rollback a Release<a class="td-heading-self-link" href="#rollback-a-release" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>!!! note +All rollbacks create a new, numbered release. But will reference the build/code and configuration from the desired rollback point.</p> +<p>In this example, the application is currently running release v4. Using <code>drycc rollback v2</code> 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:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Only rollback web process type:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="run-one-off-administration-tasks">Run One-off Administration Tasks<a class="td-heading-self-link" href="#run-one-off-administration-tasks" aria-label="Heading self-link"></a></h2> +<p>Drycc applications <a href="http://12factor.net/admin-processes">use one-off processes for admin tasks</a> like database migrations and other commands that must run against the live application.</p> +<p>Use <code>drycc run</code> to execute commands on the deployed application.</p> +<pre><code>$ 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 +</code></pre> +<h2 id="share-an-application">Share an Application<a class="td-heading-self-link" href="#share-an-application" aria-label="Heading self-link"></a></h2> +<p>Use <code>drycc perms:add</code> to allow another Drycc user to collaborate on your application.</p> +<pre tabindex="0"><code>$ drycc perms:add otheruser view,change,delete +Adding user otheruser as a collaborator for view,change,delete peachy-waxwork... done +</code></pre><p>Use <code>drycc perms</code> to see who an application is currently shared with, and <code>drycc perms:remove</code> to remove a collaborator.</p> +<p>!!! note +Collaborators can do anything with an application that its owner can do, except delete the application.</p> +<p>When working with an application that has been shared with you, clone the original repository and add Drycc&rsquo; git remote +entry before attempting to <code>git push</code> any changes to Drycc.</p> +<pre tabindex="0"><code>$ git clone https://github.com/drycc/example-java-jetty.git +Cloning into &#39;example-java-jetty&#39;... 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 -&gt; drycc/master +</code></pre><h2 id="application-troubleshooting">Application Troubleshooting<a class="td-heading-self-link" href="#application-troubleshooting" aria-label="Heading self-link"></a></h2> +<p>Applications deployed on Drycc Workflow <a href="http://12factor.net/logs">treat logs as event streams</a>. Drycc Workflow aggregates <code>stdout</code> and <code>stderr</code> +from every <a href="../reference-guide/terms.md#container">Container</a> making it easy to troubleshoot problems with your application.</p> +<p>Use <code>drycc logs</code> to view the log output from your deployed application.</p> +<pre><code>$ 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 +</code></pre> + + + + + + Docs: Mounting volumes for an Application + /docs/applications/managing-app-volumes/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/managing-app-volumes/ + + + + <p>We can use the blow command to create volumes and mount the created volumes. +Drycc create volume support <a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes">ReadWriteMany</a>, so before deploying drycc, you need to have a StorageClass ready which can support ReadWriteMany. +Deploying drycc, set controller.appStorageClass to this StorageClass.</p> +<p>Use <code>drycc volumes</code> to mount a volume for a deployed application&rsquo;s processes.</p> +<pre><code>$ 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. +</code></pre> +<h2 id="create-a-volume-for-the-application">Create a volume for the application<a class="td-heading-self-link" href="#create-a-volume-for-the-application" aria-label="Heading self-link"></a></h2> +<p>You can create a csi volume with the <code>drycc volumes:create</code> command.</p> +<pre><code>$ drycc volumes:create myvolume 200M +Creating myvolumes to scenic-icehouse... done +</code></pre> +<p>Or use an existing nfs server</p> +<pre><code>$ drycc volumes:create myvolume 200M -t nfs --nfs-server=nfs.drycc.com --nfs-path=/ +Creating myvolumes to scenic-icehouse... done +</code></pre> +<h2 id="list-volumes-in-the-application">List volumes in the application<a class="td-heading-self-link" href="#list-volumes-in-the-application" aria-label="Heading self-link"></a></h2> +<p>After volume is created, you can list the volumes in this application.</p> +<pre><code>$ drycc volumes:list +=== scenic-icehouse volumes +--- myvolumes 200M +</code></pre> +<h2 id="mount-a-volume">Mount a volume<a class="td-heading-self-link" href="#mount-a-volume" aria-label="Heading self-link"></a></h2> +<p>The volume which is named myvolumes is created, you can mount the volume with process of the application, +use the command of <code>drycc volumes:mount</code>. When volume is mounted, a new release will be created and deployed automatically.</p> +<pre><code>$ drycc volumes:mount myvolumes web=/data/web +Mounting volume... done +</code></pre> +<p>And use <code>drycc volumes:list</code> show mount detail.</p> +<pre><code>$ drycc volumes:list +=== scenic-icehouse volumes +--- myvolumes 200M +web /data/web +</code></pre> +<p>If you don&rsquo;t need the volume, use <code>drycc volumes:unmount</code> to unmount the volume and then use <code>drycc volumes:delete</code> to delete the volume from the application. +Before deleting volume, the volume has to be unmounted.</p> +<pre><code>$ drycc volumes:unmount myvolumes web +Unmounting volume... done + +$ drycc volumes:delete myvolumes +Deleting myvolumes from scenic-icehouse... done +</code></pre> +<h2 id="use-volume-client-to-manage-volume-files">Use volume client to manage volume files.<a class="td-heading-self-link" href="#use-volume-client-to-manage-volume-files" aria-label="Heading self-link"></a></h2> +<p>Assume the volume which is named myvolumes is created and mounted.</p> +<p>Prepare a file named testfile.</p> +<pre><code>$ echo &quot;testtext&quot; &gt; testfile +</code></pre> +<p>Upload. +$ drycc volumes:client cp testfile vol://myvolume/ +[↑] testfile 100% [==================================================] (5/ 5 B, 355 B/s)</p> +<p>List files in myvolume.</p> +<pre><code>$ drycc volumes:client ls vol://myvolume/ +[2024-07-22T15:32:28+08:00] 5 testfile +</code></pre> +<p>Delete testfle in myvolume.</p> +<pre><code>$ drycc volumes:client rm vol://myvolume/testfile</code></pre> + + + + + + Docs: About gateway for an Application + /docs/applications/managing-app-gateway/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/managing-app-gateway/ + + + + <p>A <a href="https://gateway-api.sigs.k8s.io/">Gateway</a> 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.</p> +<h2 id="create-gateway-for-an-application">Create Gateway for an Application<a class="td-heading-self-link" href="#create-gateway-for-an-application" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>List the containers:</p> +<pre tabindex="0"><code># drycc gateways +NAME LISENTER PORT PROTOCOL ADDRESSES +python-getting-started tcp-80-0 80 HTTP 101.65.132.51 +</code></pre><p>You can also add a port in this gateway or create a one.</p> +<pre tabindex="0"><code># drycc gateways:add python-getting-started --port=443 --protocol=HTTPS +Adding gateway python-getting-started to python-getting-started... done +</code></pre><h2 id="create-service-for-an-application">Create service for an Application<a class="td-heading-self-link" href="#create-service-for-an-application" aria-label="Heading self-link"></a></h2> +<p>Service is a way of exposing services internally, creating a service generates an internal DNS that can access <code>ptype</code>. +the web process type has been created, for others types, you should add as needed.</p> +<p>List the services:</p> +<pre tabindex="0"><code>$ drycc services +PTYPE PORT PROTOCOL TARGET-PORT DOMAIN +web 80 TCP 8000 python-getting-started.python-getting-started.svc.cluster.local +</code></pre><p>Add a new service for process type</p> +<pre tabindex="0"><code># drycc services:add --help +# drycc services:add sleep 8001:8001 +</code></pre><h2 id="create-route-for-an-application">Create Route for an Application<a class="td-heading-self-link" href="#create-route-for-an-application" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<pre tabindex="0"><code># drycc routes +NAME OWNER PTYPE KIND SERVICE-PORT GATEWAY LISTENER-PORT +python-getting-started demo web HTTPRoute 80 python-getting-started 80 +</code></pre><p>create a new route and attach gateway.</p> +<pre tabindex="0"><code>drycc routes:create sleep --ptype=sleep --kind=HTTPRoute --port=8001 +drycc routes:attach sleep --gateway=python-getting-started --port=80 +</code></pre> + + + + + Docs: Managing resources for an Application + /docs/applications/managing-app-resources/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/managing-app-resources/ + + + + <p>We can use blow command to create resources and bind which resource is created. +This command depend on <a href="https://service-catalog.drycc.cc">service-catalog</a>.</p> +<p>Use <code>drycc resources</code> to create and bind a resource for a deployed application.</p> +<pre><code>$ 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. +</code></pre> +<h2 id="list-all-available-resource-services">List all available resource services<a class="td-heading-self-link" href="#list-all-available-resource-services" aria-label="Heading self-link"></a></h2> +<p>You can list available resource services with one <code>drycc resources:services</code> command</p> +<pre><code>$ 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 +</code></pre> +<h2 id="list-all-available-plans-for-an-resource-services">List all available plans for an resource services<a class="td-heading-self-link" href="#list-all-available-plans-for-an-resource-services" aria-label="Heading self-link"></a></h2> +<p>You can list all available plans for an resource services with one <code>drycc resources:plans</code> command</p> +<pre><code>$ 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. +</code></pre> +<h2 id="create-resource-in-application">Create resource in application<a class="td-heading-self-link" href="#create-resource-in-application" aria-label="Heading self-link"></a></h2> +<p>You can create a resource with one <code>drycc resources:create</code> command</p> +<pre><code>$ drycc resources:create redis:1000 redis +Creating redis to scenic-icehouse... done +</code></pre> +<p>After resources are created, you can list the resources in this application.</p> +<pre><code>$ drycc resources:list +UUID NAME OWNER PLAN UPDATED +07220e9e-d54d-4d74-a88c-f464aa374386 redis admin redis:standard-128 2024-05-08T01:01:00Z +</code></pre> +<h2 id="bind-resources">Bind resources<a class="td-heading-self-link" href="#bind-resources" aria-label="Heading self-link"></a></h2> +<p>The resource which is named redis is created, you can bind the redis to the application, +use the command of <code>drycc resources:bind redis</code>.</p> +<pre><code>$ drycc resources:bind redis +Binding resource... done +</code></pre> +<h2 id="describe-resources">Describe resources<a class="td-heading-self-link" href="#describe-resources" aria-label="Heading self-link"></a></h2> +<p>And use <code>drycc resources:describe</code> show the binding detail. If the binding is successful, this command will show the information of connect to the resource.</p> +<pre><code>$ 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 +</code></pre> +<h2 id="update-resources">Update resources<a class="td-heading-self-link" href="#update-resources" aria-label="Heading self-link"></a></h2> +<p>You can use the <code>drycc resources:update</code> command to upgrade a new plan. +An example of how to upgrade the plan&rsquo;s capacity to 100MB:</p> +<pre><code>$ drycc resources:update redis:10000 redis +Updating redis to scenic-icehouse... done +</code></pre> +<h2 id="remove-the-resource">Remove the resource<a class="td-heading-self-link" href="#remove-the-resource" aria-label="Heading self-link"></a></h2> +<p>If you don&rsquo;t need resources, use <code>drycc resources:unbind</code> to unbind the resource and then use <code>drycc resources:destroy</code> to delete the resource from the application. +Before deleting the resource, the resource must be unbinded.</p> +<pre><code>$ drycc resources:unbind redis +Unbinding resource... done + +$ drycc resources:destroy redis +Deleting redis from scenic-icehouse... done +</code></pre> + + + + + + Docs: Inter-app Communication + /docs/applications/inter-app-communication/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/inter-app-communication/ + + + + <p>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.</p> +<h3 id="dns-service-discovery">DNS Service Discovery<a class="td-heading-self-link" href="#dns-service-discovery" aria-label="Heading self-link"></a></h3> +<p>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&rsquo;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 <a href="https://kubernetes.io/docs/user-guide/services/">Kubernetes Service</a> 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 &ldquo;app-name.app-namespace&rdquo;.</p> + + + + + + Docs: Resource Limits + /docs/applications/managing-resource-limits/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/managing-resource-limits/ + + + + <h2 id="heading"><a class="td-heading-self-link" href="#heading" aria-label="Heading self-link"></a></h2> +<h2 id="managing-application-resource-limits">Managing Application Resource Limits<a class="td-heading-self-link" href="#managing-application-resource-limits" aria-label="Heading self-link"></a></h2> +<p>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 &lt;requests&gt; amount of resource for a process as well as limit +the process from using more than &lt;limits&gt;. +By default, Kubernetes will set &lt;requests&gt; equal to &lt;limit&gt; if we don&rsquo;t explicitly set &lt;requests&gt; value. Please keep in mind that <code>0 &lt;= requests &lt;= limits</code>.</p> +<h2 id="limiting">Limiting<a class="td-heading-self-link" href="#limiting" aria-label="Heading self-link"></a></h2> +<p>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!</p> +<pre tabindex="0"><code>$ 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 +</code></pre> + + + + + Docs: Domains and Routing + /docs/applications/domains-and-routing/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/domains-and-routing/ + + + + <p>You can use <code>drycc domains</code> to add or remove custom domains to the application:</p> +<pre><code>$ drycc domains:add hello.bacongobbler.com --ptype=web +Adding hello.bacongobbler.com to finest-woodshed... done +</code></pre> +<p>Once that&rsquo;s done, you can go into a DNS registrar and set up a CNAME from the new +appname to the old one:</p> +<pre><code>$ 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 +</code></pre> +<p>!!! 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 +(&ldquo;start-of-authority&rdquo;) 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).</p> +<p>To add or remove the application from the routing mesh, use <code>drycc routing</code>:</p> +<pre><code>$ drycc routing:disable +Disabling routing for finest-woodshed... done +</code></pre> +<p>This will make the application unreachable through the <a href="/docs/understanding-workflow/components/#router">Router</a>, but the application is still +reachable internally through its <a href="../reference-guide/terms.md#service">Kubernetes Service</a>. To re-enable routing:</p> +<pre><code>$ drycc routing:enable +Enabling routing for finest-woodshed... done +</code></pre> + + + + + + Docs: Application SSL Certificates + /docs/applications/ssl-certificates/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/ssl-certificates/ + + + + <h1 id="application-ssl-certificates">Application SSL Certificates<a class="td-heading-self-link" href="#application-ssl-certificates" aria-label="Heading self-link"></a></h1> +<p>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.</p> +<p>To enable SSL on a custom domain, e.g., <code>www.example.com</code>, use the SSL endpoint.</p> +<p>!!! note +<code>drycc certs</code> is only useful for custom domains. Default application domains are +SSL-enabled already and can be accessed simply by using https, +e.g. <code>https://foo.dryccapp.com</code> (provided that you have <a href="https://gateway-api.sigs.k8s.io/guides/tls/">installed your wildcard +certificate</a> on the routers or on the load balancer).</p> +<h2 id="overview">Overview<a class="td-heading-self-link" href="#overview" aria-label="Heading self-link"></a></h2> +<p>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:</p> +<ol> +<li>Purchase an SSL certificate from your SSL provider</li> +<li>Upload the cert to Drycc</li> +</ol> +<h2 id="acquire-ssl-certificate">Acquire SSL Certificate<a class="td-heading-self-link" href="#acquire-ssl-certificate" aria-label="Heading self-link"></a></h2> +<p>Purchasing an SSL cert varies in cost and process depending on the vendor. <a href="https://www.rapidssl.com/">RapidSSL</a> offers a +simple way to purchase a certificate and is a recommended solution. If you’re able to use this +provider, see <a href="https://www.rapidssl.com/buy-ssl/">buy an SSL certificate with RapidSSL</a> for instructions.</p> +<h2 id="dns-and-domain-configuration">DNS and Domain Configuration<a class="td-heading-self-link" href="#dns-and-domain-configuration" aria-label="Heading self-link"></a></h2> +<p>Once the SSL certificate is provisioned and your cert is confirmed, you must route requests for +your domain through Drycc. Unless you&rsquo;ve already done so, add the domain specified when generating +the CSR to your app with:</p> +<pre><code>$ drycc domains:add www.example.com --ptype==web -a foo +Adding www.example.com to foo... done +</code></pre> +<h2 id="add-a-certificate">Add a Certificate<a class="td-heading-self-link" href="#add-a-certificate" aria-label="Heading self-link"></a></h2> +<p>Add your certificate, any intermediate certificates, and private key to the endpoint with the +<code>certs:add</code> command.</p> +<pre><code>$ drycc certs:add example-com server.crt server.key -a foo +Adding SSL endpoint... done +www.example.com +</code></pre> +<p>!!! note +The name given to the certificate can only contain a-z (lowercase), 0-9 and hyphens</p> +<p>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.</p> +<p>This allows for wildcard certificates and multiple domains in the SAN without uploading duplicates.</p> +<h3 id="add-a-certificate-chain">Add a Certificate Chain<a class="td-heading-self-link" href="#add-a-certificate-chain" aria-label="Heading self-link"></a></h3> +<p>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:</p> +<pre><code>$ cat server.crt server.ca &gt; server.bundle +</code></pre> +<p>After that, you can add them to Drycc with the <code>certs:add</code> command:</p> +<pre><code>$ drycc certs:add example-com server.bundle server.key -a foo +Adding SSL endpoint... done +www.example.com +</code></pre> +<h2 id="attach-ssl-certificate-to-a-domain">Attach SSL certificate to a domain<a class="td-heading-self-link" href="#attach-ssl-certificate-to-a-domain" aria-label="Heading self-link"></a></h2> +<p>Certificates are not automagically connected up to domains, instead you will have to attach a +certificate to a domain</p> +<pre><code>$ drycc certs:attach example-com example.com -a foo +</code></pre> +<p>Each certificate can be connected to many domains. There is no need to upload duplicates.</p> +<p>To remove an association</p> +<pre><code>$ drycc certs:detach example-com example.com -a foo +</code></pre> +<h2 id="endpoint-overview">Endpoint overview<a class="td-heading-self-link" href="#endpoint-overview" aria-label="Heading self-link"></a></h2> +<p>You can verify the details of your domain&rsquo;s SSL configuration with <code>drycc certs</code>.</p> +<pre><code>$ 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 +</code></pre> +<p>or by looking at at each certificates detailed information</p> +<pre><code>$ 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 +</code></pre> +<h2 id="testing-ssl">Testing SSL<a class="td-heading-self-link" href="#testing-ssl" aria-label="Heading self-link"></a></h2> +<p>Use a command line utility like <code>curl</code> to test that everything is configured correctly for your +secure domain.</p> +<p>!!! note +The -k option flag tells curl to ignore untrusted certificates.</p> +<p>Pay attention to the output. It should print <code>SSL certificate verify ok</code>. If it prints something +like <code>common name: www.example.com (does not match 'www.somedomain.com')</code> then something is not +configured correctly.</p> +<h2 id="enforcing-ssl-at-the-router">Enforcing SSL at the Router<a class="td-heading-self-link" href="#enforcing-ssl-at-the-router" aria-label="Heading self-link"></a></h2> +<p>To enforce all HTTP requests be redirected to HTTPS, TLS can be enforced at the router level by +running</p> +<pre><code>$ drycc tls:force:enable -a foo +Enabling https-only requests for foo... done +</code></pre> +<p>Users hitting the HTTP endpoint for the application will now receive a 301 redirect to the HTTPS +endpoint.</p> +<p>To disable enforced TLS, run</p> +<pre><code>$ drycc tls:force:disable -a foo +Disabling https-only requests for foo... done +</code></pre> +<h2 id="automated-certificate-management">Automated Certificate Management<a class="td-heading-self-link" href="#automated-certificate-management" aria-label="Heading self-link"></a></h2> +<p>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).</p> +<p>To enable ACM with the following command: +$ drycc tls:auto:enable -a foo</p> +<p>To disable ACM with the following command: +$ drycc tls:auto:disable -a foo</p> +<h2 id="remove-certificate">Remove Certificate<a class="td-heading-self-link" href="#remove-certificate" aria-label="Heading self-link"></a></h2> +<p>You can remove a certificate using the <code>certs:remove</code> command:</p> +<pre><code>$ drycc certs:remove my-cert -a foo +Removing www.example.com... Done. +</code></pre> +<h2 id="swapping-out-certificates">Swapping out certificates<a class="td-heading-self-link" href="#swapping-out-certificates" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>Be intentional with certificate names, name them <code>example-com-2017</code> when possible, where the year +signifies the expiry year. This allows for <code>example-com-2018</code> when a new certificate is purchased.</p> +<p>Assuming all applications are already using <code>example-com-2017</code> the following commands can be ran, +chained together or otherwise:</p> +<pre><code>$ drycc certs:detach example-com-2017 example.com -a foo +$ drycc certs:attach example-com-2018 example.com -a foo +</code></pre> +<p>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.</p> +<h2 id="troubleshooting">Troubleshooting<a class="td-heading-self-link" href="#troubleshooting" aria-label="Heading self-link"></a></h2> +<p>Here are some steps you can follow if your SSL endpoint is not working as you&rsquo;d expect.</p> +<h3 id="untrusted-certificate">Untrusted Certificate<a class="td-heading-self-link" href="#untrusted-certificate" aria-label="Heading self-link"></a></h3> +<p>In some cases when accessing the SSL endpoint, it may list your certificate as untrusted.</p> +<p>If this occurs, it may be because it is not trusted by Mozilla’s list of <a href="https://www.mozilla.org/en-US/about/governance/policies/security-group/certs/included/">root CAs</a>. If this is +the case, your certificate may be considered untrusted for many browsers.</p> +<p>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 +<a href="http://en.wikipedia.org/wiki/Intermediate_certificate_authorities">intermediary certificates</a>. If so, download the intermediary certificates from your SSL provider, +remove the certificate from Drycc and re-run the <code>certs:add</code> command.</p> + + + + + + Docs: Using drycc.yaml + /docs/applications/using-dryccfile/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/using-dryccfile/ + + + + <p>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</p> +<h2 id="dryccyaml-overview">drycc.yaml Overview<a class="td-heading-self-link" href="#dryccyaml-overview" aria-label="Heading self-link"></a></h2> +<p>A manifest has three top-level sections.</p> +<ul> +<li>build – Specifies the to build Dockerfile</li> +<li>run – Specifies the release phase tasks to execute</li> +<li>deploy – Specifies process types and the commands to run for each type</li> +</ul> +<p>Here’s an example that illustrates using a manifest to build Docker images.</p> +<pre tabindex="0"><code>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 +</code></pre><p>For more deployment information, please refer to the drycc <a href="https://github.com/drycc/samples">examples</a>.</p> + + + + + + diff --git a/docs/applications/inter-app-communication/index.html b/docs/applications/inter-app-communication/index.html new file mode 100644 index 000000000..1a500e49d --- /dev/null +++ b/docs/applications/inter-app-communication/index.html @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + +Inter-app Communication | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Inter-app Communication

+
The Communication Solution between Drycc Applicatios.
+ +

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.

+

DNS Service Discovery

+

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”.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/managing-app-configuration/index.html b/docs/applications/managing-app-configuration/index.html new file mode 100644 index 000000000..6375d1b92 --- /dev/null +++ b/docs/applications/managing-app-configuration/index.html @@ -0,0 +1,631 @@ + + + + + + + + + + + + + + + + + + + +Configuring an Application | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Configuring an Application

+
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.
+ +

Configuring an Application

+

A Drycc application stores config in environment variables.

+

Setting 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
+
+

Attach to Backing Services

+

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.

+

Buildpacks Cache

+

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.

+

Disabling and re-enabling 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.

+

Clearing 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
+
+

Custom Health Checks

+

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.

+

Autodeploy

+

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
+

Autorollback

+

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
+

Isolate the Application

+

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
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/managing-app-gateway/index.html b/docs/applications/managing-app-gateway/index.html new file mode 100644 index 000000000..49c098307 --- /dev/null +++ b/docs/applications/managing-app-gateway/index.html @@ -0,0 +1,491 @@ + + + + + + + + + + + + + + + + + + + +About gateway for an Application | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

About gateway for an Application

+
A Gateway describes how traffic can be translated to Services within the cluster.
+ +

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.

+

Create Gateway for an Application

+

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     
+

Create service for an Application

+

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
+

Create Route for an Application

+

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
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/managing-app-lifecycle/index.html b/docs/applications/managing-app-lifecycle/index.html new file mode 100644 index 000000000..3f59b3754 --- /dev/null +++ b/docs/applications/managing-app-lifecycle/index.html @@ -0,0 +1,554 @@ + + + + + + + + + + + + + + + + + + + +Managing an Application | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Managing an Application

+
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.
+ +

Track Application Changes

+

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
+

Rollback a 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
+

Run One-off Administration Tasks

+

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
+
+

Share an Application

+

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
+

Application Troubleshooting

+

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
+
+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/managing-app-metrics/index.html b/docs/applications/managing-app-metrics/index.html new file mode 100644 index 000000000..fc9c2f149 --- /dev/null +++ b/docs/applications/managing-app-metrics/index.html @@ -0,0 +1,485 @@ + + + + + + + + + + + + + + + + + + + +Managing Application Metrics | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Managing Application Metrics

+
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.
+ +

Create an authentication token

+

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
+

Add scrape configurations for prometheus

+

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']
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/managing-app-processes/index.html b/docs/applications/managing-app-processes/index.html new file mode 100644 index 000000000..23e6ec7b5 --- /dev/null +++ b/docs/applications/managing-app-processes/index.html @@ -0,0 +1,699 @@ + + + + + + + + + + + + + + + + + + + +Managing Application Processes | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Managing Application Processes

+
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.
+ +

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.

+

Default Process Types

+

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.

+

Declaring Process Types

+

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
+

Scaling Processes

+

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

+

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.

+

Fetch a container logs of the application

+

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
+

Get a container info of the application

+

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 a container of the application

+

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
+

Get a Shell to a Running Container

+

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).

+

Restarting an Application Processes

+

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).

+

List an Application Process Types

+
$ 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    
+

Get deployment info of the application process type

+
$ 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  
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/managing-app-resources/index.html b/docs/applications/managing-app-resources/index.html new file mode 100644 index 000000000..29c610904 --- /dev/null +++ b/docs/applications/managing-app-resources/index.html @@ -0,0 +1,567 @@ + + + + + + + + + + + + + + + + + + + +Managing resources for an Application | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Managing resources for an Application

+
Tools and services for developing, extending, and operating your app.
+ +

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.
+
+

List all available resource services

+

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
+
+

List all available plans for an resource services

+

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.
+
+

Create resource in application

+

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   
+
+

Bind resources

+

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
+
+

Describe resources

+

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
+
+

Update resources

+

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
+
+

Remove the resource

+

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
+
+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/managing-app-volumes/index.html b/docs/applications/managing-app-volumes/index.html new file mode 100644 index 000000000..f49df1fd8 --- /dev/null +++ b/docs/applications/managing-app-volumes/index.html @@ -0,0 +1,527 @@ + + + + + + + + + + + + + + + + + + + +Mounting volumes for an Application | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Mounting volumes for an Application

+
Drycc supports many types of volumes. A container can use any number of volume types simultaneously.
+ +

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.
+
+

Create a volume for the application

+

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
+
+

List volumes in the application

+

After volume is created, you can list the volumes in this application.

+
$ drycc volumes:list
+=== scenic-icehouse volumes
+--- myvolumes     200M
+
+

Mount a volume

+

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
+
+

Use volume client to manage volume files.

+

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
+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/managing-resource-limits/index.html b/docs/applications/managing-resource-limits/index.html new file mode 100644 index 000000000..9091f1100 --- /dev/null +++ b/docs/applications/managing-resource-limits/index.html @@ -0,0 +1,484 @@ + + + + + + + + + + + + + + + + + + + +Resource Limits | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Resource Limits

+
Drycc Workflow supports restricting memory and CPU shares of each process.
+ +

+

Managing Application Resource Limits

+

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.

+

Limiting

+

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
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/ssl-certificates/index.html b/docs/applications/ssl-certificates/index.html new file mode 100644 index 000000000..3ef8cdeb9 --- /dev/null +++ b/docs/applications/ssl-certificates/index.html @@ -0,0 +1,618 @@ + + + + + + + + + + + + + + + + + + + +Application SSL Certificates | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Application SSL Certificates

+
SSL is a cryptographic protocol that provides end-to-end encryption and integrity for all web requests.
+ +

Application SSL Certificates

+

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).

+

Overview

+

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:

+
    +
  1. Purchase an SSL certificate from your SSL provider
  2. +
  3. Upload the cert to Drycc
  4. +
+

Acquire SSL Certificate

+

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.

+

DNS and Domain Configuration

+

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 a Certificate

+

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.

+

Add a Certificate Chain

+

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
+
+

Attach SSL certificate to a domain

+

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
+
+

Endpoint overview

+

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
+
+

Testing SSL

+

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.

+

Enforcing SSL at the Router

+

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
+
+

Automated Certificate Management

+

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

+

Remove Certificate

+

You can remove a certificate using the certs:remove command:

+
$ drycc certs:remove my-cert -a foo
+Removing www.example.com... Done.
+
+

Swapping out certificates

+

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.

+

Troubleshooting

+

Here are some steps you can follow if your SSL endpoint is not working as you’d expect.

+

Untrusted Certificate

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/using-buildpacks/index.html b/docs/applications/using-buildpacks/index.html new file mode 100644 index 000000000..3196d076d --- /dev/null +++ b/docs/applications/using-buildpacks/index.html @@ -0,0 +1,600 @@ + + + + + + + + + + + + + + + + + + + +Using Buildpacks | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Using Buildpacks

+
An overview of buildpacks, which are responsible for transforming deployed code into a slug, which can then be executed on a container.
+ +

Drycc supports deploying applications via Cloud Native Buildpacks. Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.

+

Add SSH Key

+

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.

+

Prepare an Application

+

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
+
+

Create an Application

+

Use drycc create to create an application on the Controller.

+
$ drycc create
+Creating application... done, created skiing-keypunch
+Git remote drycc added
+
+

Push to Deploy

+

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.

+

Included Buildpacks

+

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.

+

Using a Custom Buildpack

+

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.

+

Using Private Repositories

+

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
+
+

Builder selector

+

Which way to build a project conforms to the following principles:

+
    +
  • If Dockerfile exists in the project, the stack uses container
  • +
  • If Procfile exists in the project, the stack uses buildpack
  • +
  • If both exist, container is used by default
  • +
  • You can also set the DRYCC_STACK to container or buildpack determine which stack to use.
  • +
+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/using-container-images/index.html b/docs/applications/using-container-images/index.html new file mode 100644 index 000000000..54b05286d --- /dev/null +++ b/docs/applications/using-container-images/index.html @@ -0,0 +1,530 @@ + + + + + + + + + + + + + + + + + + + +Using Docker Images | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Using Docker Images

+
Deploy an application using a container image stored in your Drycc Container Registry.
+ +

Drycc supports deploying applications via an existing Docker Image. +This is useful for integrating Drycc into Docker-based CI/CD pipelines.

+

Prepare an Application

+

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
+
+

Docker Image Requirements

+

In order to deploy Docker images, they must conform to the following requirements:

+
    +
  • The Dockerfile must use the EXPOSE directive to expose exactly one port.
  • +
  • That port must be listening for an HTTP connection.
  • +
  • The Dockerfile must use the CMD directive to define the default process that will run within the container.
  • +
  • The Docker image must contain bash to run processes.
  • +
+

!!! 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.

+

Create an Application

+

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.

+

Deploy the Application

+

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.

+

Private Registry

+

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:

+
    +
  • Gather the username and password for the registry, such as a Quay.io Robot Account or a GCR.io Long Lived Token
  • +
  • Run drycc registry:set username=<the-user> password=<secret> -a <application-name>
  • +
  • Now perform drycc pull as normal, against an image in the private registry
  • +
+

When 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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/using-dockerfiles/index.html b/docs/applications/using-dockerfiles/index.html new file mode 100644 index 000000000..b846538ae --- /dev/null +++ b/docs/applications/using-dockerfiles/index.html @@ -0,0 +1,582 @@ + + + + + + + + + + + + + + + + + + + +Using Dockerfiles | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Using Dockerfiles

+
Drycc Container Registry allows you to deploy your Docker-based app to Drycc. Both Common Runtime and Private Spaces are supported.
+ +

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.

+

Add SSH Key

+

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.

+

Prepare an Application

+

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
+
+

Dockerfile Requirements

+

In order to deploy Dockerfile applications, they must conform to the following requirements:

+
    +
  • The Dockerfile must use the EXPOSE directive to expose exactly one port.
  • +
  • That port must be listening for an HTTP connection.
  • +
  • The Dockerfile must use the CMD directive to define the default process that will run within the container.
  • +
  • The Container image must contain bash to run processes.
  • +
+

!!! 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.

+

Create an Application

+

Use drycc create to create an application on the Controller.

+
$ drycc create
+Creating application... done, created folksy-offshoot
+Git remote drycc added
+
+

Push to Deploy

+

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.

+

Container Build Arguments

+

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
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/applications/using-dryccfile/index.html b/docs/applications/using-dryccfile/index.html new file mode 100644 index 000000000..b4b8da2ac --- /dev/null +++ b/docs/applications/using-dryccfile/index.html @@ -0,0 +1,509 @@ + + + + + + + + + + + + + + + + + + + +Using drycc.yaml | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Using drycc.yaml

+
Drycc Container Registry allows you to deploy your Docker-based app to Drycc. Both Common Runtime and Private Spaces are supported.
+ +

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

+

drycc.yaml Overview

+

A manifest has three top-level sections.

+
    +
  • build – Specifies the to build Dockerfile
  • +
  • run – Specifies the release phase tasks to execute
  • +
  • deploy – Specifies process types and the commands to run for each type
  • +
+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/contribution-guidelines/_print/index.html b/docs/contribution-guidelines/_print/index.html new file mode 100644 index 000000000..c60fe23f2 --- /dev/null +++ b/docs/contribution-guidelines/_print/index.html @@ -0,0 +1,838 @@ + + + + + + + + + + + + + + + + + + + + + +Contribution Guidelines | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Contribution Guidelines

+
This HowTo is for project maintainers who need a Contributing Guide for their project.
+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + +
+ +

1 - Contributor Overview

+
Interested in contributing to a Drycc project? There are lots of ways to help.
+

File Bugs & Enhancements

+

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.

+

Write Documentation

+

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.

+

Contribute Code

+

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.

+

Triage Issues

+

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.

+

Share your Experience

+

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.

+ +
+ + + + + + + + + + + +
+ +

2 - Design Documents

+
Before submitting a pull request which will significantly alter the behavior of any Drycc component.
+

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.

+

Goals

+

Design documents help ensure project contributors:

+
    +
  • Involve stakeholders as early as possible in a feature’s development
  • +
  • Ensure code changes accomplish the original motivations and design goals
  • +
  • Establish clear acceptance criteria for a feature or change
  • +
  • Enforce test-driven design methodology and automated test coverage
  • +
+

Contents

+

Design document issues should be named Design Doc: <change description> and contain the following sections:

+

Goal

+

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.

+

Code Changes

+

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.

+

Tests

+

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.

+

Approval

+

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.

+ +
+ + + + + + + + + + + +
+ +

3 - Development Environment

+
This document is for developers who are interested in working directly on the Drycc codebase.
+

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.

+

Prerequisites

+

In order to successfully compile and test Drycc binaries and build Container images of Drycc components, the following are required:

+
    +
  • git
  • +
  • Go 1.5 or later, with support for compiling to linux/amd64
  • +
  • glide
  • +
  • golint
  • +
  • shellcheck
  • +
  • Podman (in a non-Linux environment, you will additionally want [Podman Machine][machine])
  • +
+

For drycc/controller, in particular, you will also need:

+
    +
  • Python 2.7 or later (with pip)
  • +
  • virtualenv (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.

+

Configuring Go

+

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.

+

Fork the Repository

+

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.

+

Alternative: Forking with a Pushurl

+

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.

+

Make Your Changes

+

With your development environment set up and the code you wish to work on forked and cloned, you can begin making your changes.

+

Test Your Changes

+

Drycc components each include a comprehensive suite of automated tests, mostly written in Go. See testing for instructions on running the tests.

+

Deploying Your Changes

+

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.

+

Running a Kubernetes Cluster for Development

+

To run a Kubernetes cluster locally or elsewhere to support your development activities, refer to Drycc installation instructions here.

+

Using a Development Registry

+

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.

+

Dev / Deployment Workflow

+

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:

+
    +
  1. Update source code and commit your changes using git
  2. +
  3. Use make build to build a new Container image
  4. +
  5. Use make dev-release to generate Kubernetes manifest(s)
  6. +
  7. Use make deploy to restart the component using the updated manifest
  8. +
+

This can be shortened to a one-liner using just the deploy target:

+
$ make deploy
+

Useful Commands

+

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:

+

See All Drycc Pods

+
$ kubectl --namespace=drycc get pods
+

Describe a Pod

+

This is often useful for troubleshooting pods that are in pending or crashed states:

+
$ kubectl --namespace=drycc describe -f <pod name>
+

Tail Logs

+
$ kubectl --namespace=drycc logs -f <pod name>
+

Django Shell

+

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!

+

Pull Requests

+

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.

+ +
+ + + + + + + + + + + +
+ +

4 - Testing Drycc

+
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.
+

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.

+

Set Up the Environment

+

Successfully executing the unit and functional tests for any Drycc component requires that the Development Environment is set up first.

+

Run the Tests

+

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.

+ +
+ + + + + + + + + + + +
+ +

5 - Submitting a Pull Request

+
Proposed changes to Drycc projects are made as GitHub pull requests.
+

Design Document

+

Before opening a pull request, ensure your change also references a design document if the contribution is substantial. For more information, see Design Documents.

+

Single Issue

+

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.

+

Include Tests

+

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.

+

Include Docs

+

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.

+

Cross-repo commits

+

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
+

Code Standards

+

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.

+

Commit Style

+

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 -> feature
  • +
  • fix -> bug fix
  • +
  • docs -> documentation
  • +
  • style -> formatting
  • +
  • ref -> refactoring code
  • +
  • test -> adding missing tests
  • +
  • chore -> maintenance
  • +
+

The {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.

+

Merge Approval

+

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.

+ +
+ + + + + + + + + + + +
+ +

6 - Community

+
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.
+

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.

+

Open Source Bounties

+

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.

+ +
+ + + + + + + + + + + +
+ +

7 - Triaging Issues

+
Issue triage provides an important way to contribute to an open source project.
+

Triage helps ensure issues resolve quickly by:

+
    +
  • Describing the issue’s intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences an problem and what actions they took.
  • +
  • Giving a contributor the information they need before they commit to resolving an issue.
  • +
  • Lowering the issue count by preventing duplicate issues.
  • +
  • Streamlining the development process by preventing duplicate discussions.
  • +
+

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.

+

Ensure the Issue Contains Basic Information

+

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:

+
    +
  • the version(s) of Drycc this issue affects
  • +
  • a reproducible case if this is a bug
  • +
  • page URL if this is a docs issue or the name of a man page
  • +
+

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.

+

Classifying the Issue

+

An issue can have multiple of the following labels:

+

Issue Kind

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KindDescription
bugBugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate.
docsWriting documentation, man pages, articles, blogs, or other significant word-driven task.
enhancementEnhancements can drastically improve usability or performance of a component.
questionContains a user or contributor question requiring a response.
securitySecurity-related issues such as TLS encryption, network segregation, authn/authz features, etc.
+

Functional Area

+
    +
  • builder
  • +
  • cache
  • +
  • contrib and provisioning
  • +
  • client
  • +
  • controller
  • +
  • database
  • +
  • docs
  • +
  • kubernetes
  • +
  • registry
  • +
  • router
  • +
  • store (Ceph)
  • +
  • tests
  • +
+

Easy Fix

+

“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.

+

Prioritizing issues

+

When attached to a specific milestone, an issue can be attributed one of the following labels to indicate their degree of priority.

+ + + + + + + + + + + + + + + + + +
PriorityDescription
priority 0Urgent: Security, critical bugs, blocking issues. Drop everything and fix this today, then consider creating a patch release.
priority 1Serious: 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.

+ +
+ + + + + + + + + + + +
+ +

8 - Conduct

+
The Drycc community welcomes and encourages participation by everyone.
+

Conduct

+

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:

+
    +
  1. +

    Be welcoming, friendly, and patient.

    +
  2. +
  3. +

    Be considerate.

    +
  4. +
+

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.

+
    +
  1. Be respectful.
  2. +
+

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.

+
    +
  1. Be careful in the words that you choose.
  2. +
+

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.)

+ +
+ + + + + + + + + + + +
+ +

9 - Drycc Maintainers

+
This document serves to describe the leadership structure of the Drycc project, and list the current project maintainers.
+

What is a maintainer?

+

(Unabashedly stolen from the Podman project)

+

There are different types of maintainers, with different responsibilities, but +all maintainers have 3 things in common:

+
    +
  1. They share responsibility in the project’s success.
  2. +
  3. They have made a long-term, recurring time investment to improve the project.
  4. +
  5. They spend that time doing whatever needs to be done, not necessarily what +is the most interesting or fun.
  6. +
+

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 maintainers

+

Drycc has two groups of maintainers in addition to our beloved Benevolent Dictator for Life.

+

BDFL

+

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

+

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:

+
    +
  • Classify and respond to GitHub issues and review pull requests
  • +
  • Help to shape the Drycc roadmap and lead efforts to accomplish roadmap milestones
  • +
  • Participate actively in feature development and bug fixing
  • +
  • Answer questions and help users in the Drycc #community Slack channel
  • +
+

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

+

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.

+

Becoming a maintainer

+

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:

+
    +
  • Sustained contributions to the project over a period of time (usually months)
  • +
  • A willingness to help Drycc users on GitHub and in the Drycc #community Slack channel
  • +
  • A friendly attitude :)
  • +
+

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.

+ +
+ + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/docs/contribution-guidelines/community/index.html b/docs/contribution-guidelines/community/index.html new file mode 100644 index 000000000..5387147ba --- /dev/null +++ b/docs/contribution-guidelines/community/index.html @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + +Community | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Community

+
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.
+ +

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.

+

Open Source Bounties

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/contribution-guidelines/conduct/index.html b/docs/contribution-guidelines/conduct/index.html new file mode 100644 index 000000000..d2b2c74fe --- /dev/null +++ b/docs/contribution-guidelines/conduct/index.html @@ -0,0 +1,475 @@ + + + + + + + + + + + + + + + + + + + +Conduct | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Conduct

+
The Drycc community welcomes and encourages participation by everyone.
+ +

Conduct

+

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:

+
    +
  1. +

    Be welcoming, friendly, and patient.

    +
  2. +
  3. +

    Be considerate.

    +
  4. +
+

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.

+
    +
  1. Be respectful.
  2. +
+

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.

+
    +
  1. Be careful in the words that you choose.
  2. +
+

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.)

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/contribution-guidelines/design-documents/index.html b/docs/contribution-guidelines/design-documents/index.html new file mode 100644 index 000000000..694690a60 --- /dev/null +++ b/docs/contribution-guidelines/design-documents/index.html @@ -0,0 +1,491 @@ + + + + + + + + + + + + + + + + + + + +Design Documents | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Design Documents

+
Before submitting a pull request which will significantly alter the behavior of any Drycc component.
+ +

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.

+

Goals

+

Design documents help ensure project contributors:

+
    +
  • Involve stakeholders as early as possible in a feature’s development
  • +
  • Ensure code changes accomplish the original motivations and design goals
  • +
  • Establish clear acceptance criteria for a feature or change
  • +
  • Enforce test-driven design methodology and automated test coverage
  • +
+

Contents

+

Design document issues should be named Design Doc: <change description> and contain the following sections:

+

Goal

+

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.

+

Code Changes

+

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.

+

Tests

+

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.

+

Approval

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/contribution-guidelines/development-environment/index.html b/docs/contribution-guidelines/development-environment/index.html new file mode 100644 index 000000000..7db75eea1 --- /dev/null +++ b/docs/contribution-guidelines/development-environment/index.html @@ -0,0 +1,592 @@ + + + + + + + + + + + + + + + + + + + +Development Environment | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Development Environment

+
This document is for developers who are interested in working directly on the Drycc codebase.
+ +

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.

+

Prerequisites

+

In order to successfully compile and test Drycc binaries and build Container images of Drycc components, the following are required:

+
    +
  • git
  • +
  • Go 1.5 or later, with support for compiling to linux/amd64
  • +
  • glide
  • +
  • golint
  • +
  • shellcheck
  • +
  • Podman (in a non-Linux environment, you will additionally want [Podman Machine][machine])
  • +
+

For drycc/controller, in particular, you will also need:

+
    +
  • Python 2.7 or later (with pip)
  • +
  • virtualenv (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.

+

Configuring Go

+

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.

+

Fork the Repository

+

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.

+

Alternative: Forking with a Pushurl

+

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.

+

Make Your Changes

+

With your development environment set up and the code you wish to work on forked and cloned, you can begin making your changes.

+

Test Your Changes

+

Drycc components each include a comprehensive suite of automated tests, mostly written in Go. See testing for instructions on running the tests.

+

Deploying Your Changes

+

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.

+

Running a Kubernetes Cluster for Development

+

To run a Kubernetes cluster locally or elsewhere to support your development activities, refer to Drycc installation instructions here.

+

Using a Development Registry

+

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.

+

Dev / Deployment Workflow

+

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:

+
    +
  1. Update source code and commit your changes using git
  2. +
  3. Use make build to build a new Container image
  4. +
  5. Use make dev-release to generate Kubernetes manifest(s)
  6. +
  7. Use make deploy to restart the component using the updated manifest
  8. +
+

This can be shortened to a one-liner using just the deploy target:

+
$ make deploy
+

Useful Commands

+

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:

+

See All Drycc Pods

+
$ kubectl --namespace=drycc get pods
+

Describe a Pod

+

This is often useful for troubleshooting pods that are in pending or crashed states:

+
$ kubectl --namespace=drycc describe -f <pod name>
+

Tail Logs

+
$ kubectl --namespace=drycc logs -f <pod name>
+

Django Shell

+

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!

+

Pull Requests

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/contribution-guidelines/index.html b/docs/contribution-guidelines/index.html new file mode 100644 index 000000000..77d163b6a --- /dev/null +++ b/docs/contribution-guidelines/index.html @@ -0,0 +1,508 @@ + + + + + + + + + + + + + + + + + + + + + +Contribution Guidelines | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Contribution Guidelines

+
This HowTo is for project maintainers who need a Contributing Guide for their project.
+ + +
+ + +
+
+
+ Contributor Overview +
+

Interested in contributing to a Drycc project? There are lots of ways to help.

+
+
+
+ Design Documents +
+

Before submitting a pull request which will significantly alter the behavior of any Drycc component.

+
+
+
+ Development Environment +
+

This document is for developers who are interested in working directly on the Drycc codebase.

+
+
+
+ Testing Drycc +
+

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.

+
+
+
+ Submitting a Pull Request +
+

Proposed changes to Drycc projects are made as GitHub pull requests.

+
+
+
+ Community +
+

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.

+
+
+
+ Triaging Issues +
+

Issue triage provides an important way to contribute to an open source project.

+
+
+
+ Conduct +
+

The Drycc community welcomes and encourages participation by everyone.

+
+
+
+ Drycc Maintainers +
+

This document serves to describe the leadership structure of the Drycc project, and list the current project maintainers.

+
+
+ +
+ + + + + + +
+ +
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/contribution-guidelines/index.xml b/docs/contribution-guidelines/index.xml new file mode 100644 index 000000000..90443418f --- /dev/null +++ b/docs/contribution-guidelines/index.xml @@ -0,0 +1,543 @@ + + + Drycc – Contribution Guidelines + /docs/contribution-guidelines/ + Recent content in Contribution Guidelines on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Docs: Contributor Overview + /docs/contribution-guidelines/overview/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/overview/ + + + + <h2 id="file-bugs--enhancements">File Bugs &amp; Enhancements<a class="td-heading-self-link" href="#file-bugs--enhancements" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>Our official support channel is the <a href="https://slack.drycc.cc">Drycc #community Slack channel</a>.</p> +<p>Don&rsquo;t know what the applicable repository for an issue is? Open up in issue in <a href="https://github.com/drycc/workflow">workflow</a> or chat with a maintainer in the <a href="https://slack.drycc.cc">Drycc #community Slack channel</a> and we&rsquo;ll make sure it gets to the right place.</p> +<p>Additionally, take a look at the <a href="/docs/troubleshooting/">troubleshooting</a> documentation for common issues.</p> +<p>Before opening a new issue, it&rsquo;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 <a href="https://github.com/pulls?utf8=%E2%9C%93&q=user%3Adrycc+user%3Ahelm">here</a>.</p> +<h2 id="write-documentation">Write Documentation<a class="td-heading-self-link" href="#write-documentation" aria-label="Heading self-link"></a></h2> +<p>We are always looking to improve and expand our documentation. Most docs reside in the <a href="https://github.com/drycc/workflow">drycc/workflow</a> repository. Simply fork the project, update docs and send us a pull request.</p> +<h2 id="contribute-code">Contribute Code<a class="td-heading-self-link" href="#contribute-code" aria-label="Heading self-link"></a></h2> +<p>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 <a href="https://slack.drycc.cc">Drycc #community Slack channel</a>. Make sure to check out issues tagged <a href="https://github.com/pulls?utf8=%E2%9C%93&q=user%3Adrycc+label%3A%22easy+fix%22+is%3Aopen">easy fix</a> or <a href="https://github.com/pulls?utf8=%E2%9C%93&q=user%3Adrycc+label%3A%22help+wanted%22+is%3Aopen">help wanted</a>.</p> +<p>When you&rsquo;re ready to begin writing code, review <a href="/docs/contribution-guidelines/design-documents/">Design Documents</a> and get your <a href="/docs/contribution-guidelines/development-environment/">Development Environment</a> set up.</p> +<p>By contributing to any Drycc project you agree to its <a href="https://github.com/drycc/workflow/blob/main/DCO">Developer Certificate of Origin (DCO)</a>. 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.</p> +<h2 id="triage-issues">Triage Issues<a class="td-heading-self-link" href="#triage-issues" aria-label="Heading self-link"></a></h2> +<p>If you don&rsquo;t have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours. See <a href="/docs/contribution-guidelines/triaging-issues/">Triaging Issues</a> for more info.</p> +<h2 id="share-your-experience">Share your Experience<a class="td-heading-self-link" href="#share-your-experience" aria-label="Heading self-link"></a></h2> +<p>Interact with the community on our user mailing list or live in our <a href="https://slack.drycc.cc">Drycc #community Slack channel</a>, where you can chat with other Drycc Workflow users any time of day.</p> + + + + + + Docs: Design Documents + /docs/contribution-guidelines/design-documents/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/design-documents/ + + + + <p>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.</p> +<h2 id="goals">Goals<a class="td-heading-self-link" href="#goals" aria-label="Heading self-link"></a></h2> +<p>Design documents help ensure project contributors:</p> +<ul> +<li>Involve stakeholders as early as possible in a feature&rsquo;s development</li> +<li>Ensure code changes accomplish the original motivations and design goals</li> +<li>Establish clear acceptance criteria for a feature or change</li> +<li>Enforce test-driven design methodology and automated test coverage</li> +</ul> +<h2 id="contents">Contents<a class="td-heading-self-link" href="#contents" aria-label="Heading self-link"></a></h2> +<p>Design document issues should be named <code>Design Doc: &lt;change description&gt;</code> and contain the following sections:</p> +<h3 id="goal">Goal<a class="td-heading-self-link" href="#goal" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p>This section should also reference a separate GitHub issue tracking the feature or change, which will typically be assigned to a release milestone.</p> +<h3 id="code-changes">Code Changes<a class="td-heading-self-link" href="#code-changes" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<h3 id="tests">Tests<a class="td-heading-self-link" href="#tests" aria-label="Heading self-link"></a></h3> +<p>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&rsquo;t introduce any regressions.</p> +<p>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.</p> +<p>The tests described here also form the acceptance criteria for the change, so that when it&rsquo;s completed maintainers can merge the pull request after confirming the tests pass CI.</p> +<h3 id="approval">Approval<a class="td-heading-self-link" href="#approval" aria-label="Heading self-link"></a></h3> +<p>A design document follows the same <a href="/docs/contribution-guidelines/submitting-a-pull-request/#merge-approval">merge approval</a> 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.</p> +<p>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.</p> +<p>See <a href="/docs/contribution-guidelines/submitting-a-pull-request/">Submitting a Pull Request</a> for more information on pull request and commit message formatting.</p> + + + + + + Docs: Development Environment + /docs/contribution-guidelines/development-environment/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/development-environment/ + + + + <p>In this guide, we walk you through the process of setting up a development environment that is suitable for hacking on most Drycc components.</p> +<p>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.</p> +<p>!!! 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 <a href="https://github.com/drycc/router">drycc/router</a> project for a working example of a fully containerized development environment.</p> +<p>If you&rsquo;re just getting into the Drycc codebase, look for GitHub issues with the label <a href="https://github.com/issues?q=user%3Adrycc+label%3Aeasy-fix+is%3Aopen">easy-fix</a>. These are more straightforward or low-risk issues and are a great way to become more familiar with Drycc.</p> +<h2 id="prerequisites">Prerequisites<a class="td-heading-self-link" href="#prerequisites" aria-label="Heading self-link"></a></h2> +<p>In order to successfully compile and test Drycc binaries and build Container images of Drycc components, the following are required:</p> +<ul> +<li><a href="https://git-scm.com/">git</a></li> +<li>Go 1.5 or later, with support for compiling to <code>linux/amd64</code></li> +<li><a href="https://github.com/Masterminds/glide">glide</a></li> +<li><a href="https://github.com/golang/lint">golint</a></li> +<li><a href="https://github.com/koalaman/shellcheck">shellcheck</a></li> +<li><a href="https://podman.io/">Podman</a> (in a non-Linux environment, you will additionally want [Podman Machine][machine])</li> +</ul> +<p>For <a href="https://github.com/drycc/controller">drycc/controller</a>, in particular, you will also need:</p> +<ul> +<li>Python 2.7 or later (with <code>pip</code>)</li> +<li>virtualenv (<code>sudo pip install virtualenv</code>)</li> +</ul> +<p>In most cases, you should simply install according to the instructions. There are a few special cases, though. We cover these below.</p> +<h3 id="configuring-go">Configuring Go<a class="td-heading-self-link" href="#configuring-go" aria-label="Heading self-link"></a></h3> +<p>If your local workstation does not support the <code>linux/amd64</code> 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.</p> +<p>Homebrew users can just install with cross compiling support:</p> +<pre tabindex="0"><code>$ brew install go --with-cc-common +</code></pre><p>It is also straightforward to build Go from source:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Once you can compile to <code>linux/amd64</code>, you should be able to compile Drycc components as normal.</p> +<h2 id="fork-the-repository">Fork the Repository<a class="td-heading-self-link" href="#fork-the-repository" aria-label="Heading self-link"></a></h2> +<p>Once the prerequisites have been met, we can begin to work with Drycc components.</p> +<p>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 <code>$GOPATH/src/github.com/drycc/</code>.</p> +<pre tabindex="0"><code>$ mkdir -p $GOPATH/src/github.com/drycc +$ cd $GOPATH/src/github.com/drycc +$ git clone git@github.com:&lt;username&gt;/&lt;component&gt;.git +$ cd &lt;component&gt; +</code></pre><p>!!! note +By checking out the forked copy into the namespace <code>github.com/drycc/&lt;component&gt;</code>, we are tricking the Go toolchain into seeing our fork as the &ldquo;official&rdquo; source tree.</p> +<p>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&rsquo;s main branch. There are various strategies for doing this, but the <a href="https://help.github.com/articles/fork-a-repo/">most common</a> is to add an <code>upstream</code> remote:</p> +<pre tabindex="0"><code>$ git remote add upstream https://github.com/drycc/&lt;component&gt;.git +</code></pre><p>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:</p> +<pre tabindex="0"><code>$ export DRYCC=$GOPATH/src/github.com/drycc +</code></pre><p>Throughout the rest of this document, <code>$DRYCC</code> refers to that location.</p> +<h3 id="alternative-forking-with-a-pushurl">Alternative: Forking with a Pushurl<a class="td-heading-self-link" href="#alternative-forking-with-a-pushurl" aria-label="Heading self-link"></a></h3> +<p>A number of Drycc contributors prefer to pull directly from <code>drycc/&lt;component&gt;</code>, but push to <code>&lt;username&gt;/&lt;component&gt;</code>. If that workflow suits you better, you can set it up this way:</p> +<pre tabindex="0"><code>$ git clone git@github.com:drycc/&lt;component&gt;.git +$ cd drycc +$ git config remote.origin.pushurl git@github.com:&lt;username&gt;/&lt;component&gt;.git +</code></pre><p>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.</p> +<h2 id="make-your-changes">Make Your Changes<a class="td-heading-self-link" href="#make-your-changes" aria-label="Heading self-link"></a></h2> +<p>With your development environment set up and the code you wish to work on forked and cloned, you can begin making your changes.</p> +<h2 id="test-your-changes">Test Your Changes<a class="td-heading-self-link" href="#test-your-changes" aria-label="Heading self-link"></a></h2> +<p>Drycc components each include a comprehensive suite of automated tests, mostly written in Go. See <a href="/docs/contribution-guidelines/testing/">testing</a> for instructions on running the tests.</p> +<h2 id="deploying-your-changes">Deploying Your Changes<a class="td-heading-self-link" href="#deploying-your-changes" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<h3 id="running-a-kubernetes-cluster-for-development">Running a Kubernetes Cluster for Development<a class="td-heading-self-link" href="#running-a-kubernetes-cluster-for-development" aria-label="Heading self-link"></a></h3> +<p>To run a Kubernetes cluster locally or elsewhere to support your development activities, refer to Drycc installation instructions <a href="/docs/quickstart/">here</a>.</p> +<h3 id="using-a-development-registry">Using a Development Registry<a class="td-heading-self-link" href="#using-a-development-registry" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p>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 <em>as</em> a Container container.</p> +<p>To facilitate this, most Drycc components provide a make target to create such a registry:</p> +<pre tabindex="0"><code>$ make dev-registry +</code></pre><p>In a Linux environment, to begin using the registry:</p> +<pre tabindex="0"><code>export DRYCC_REGISTRY=&lt;IP of the host machine&gt;:5000 +</code></pre><p>In non-Linux environments:</p> +<pre tabindex="0"><code>export DRYCC_REGISTRY=&lt;IP of the drycc Container Machine VM&gt;:5000 +</code></pre><p>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 <a href="https://quay.io/">quay.io</a> will suffice.</p> +<p>To use DockerHub for this purpose, for instance:</p> +<pre tabindex="0"><code>$ export DRYCC_REGISTRY=&#34;registry.drycc.cc&#34; +$ export IMAGE_PREFIX=&lt;your DockerHub username&gt; +</code></pre><p>To use quay.io:</p> +<pre tabindex="0"><code>$ export DRYCC_REGISTRY=quay.io +$ export IMAGE_PREFIX=&lt;your quay.io username&gt; +</code></pre><p>Note the importance of the trailing slash.</p> +<h3 id="dev--deployment-workflow">Dev / Deployment Workflow<a class="td-heading-self-link" href="#dev--deployment-workflow" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p>In the general case, this workflow looks like this:</p> +<ol> +<li>Update source code and commit your changes using <code>git</code></li> +<li>Use <code>make build</code> to build a new Container image</li> +<li>Use <code>make dev-release</code> to generate Kubernetes manifest(s)</li> +<li>Use <code>make deploy</code> to restart the component using the updated manifest</li> +</ol> +<p>This can be shortened to a one-liner using just the <code>deploy</code> target:</p> +<pre tabindex="0"><code>$ make deploy +</code></pre><h2 id="useful-commands">Useful Commands<a class="td-heading-self-link" href="#useful-commands" aria-label="Heading self-link"></a></h2> +<p>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:</p> +<h3 id="see-all-drycc-pods">See All Drycc Pods<a class="td-heading-self-link" href="#see-all-drycc-pods" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>$ kubectl --namespace=drycc get pods +</code></pre><h3 id="describe-a-pod">Describe a Pod<a class="td-heading-self-link" href="#describe-a-pod" aria-label="Heading self-link"></a></h3> +<p>This is often useful for troubleshooting pods that are in pending or crashed states:</p> +<pre tabindex="0"><code>$ kubectl --namespace=drycc describe -f &lt;pod name&gt; +</code></pre><h3 id="tail-logs">Tail Logs<a class="td-heading-self-link" href="#tail-logs" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>$ kubectl --namespace=drycc logs -f &lt;pod name&gt; +</code></pre><h3 id="django-shell">Django Shell<a class="td-heading-self-link" href="#django-shell" aria-label="Heading self-link"></a></h3> +<p>Specific to <a href="https://github.com/drycc/controller">drycc/controller</a></p> +<pre tabindex="0"><code>$ kubectl --namespace=drycc exec -it &lt;pod name&gt; -- python manage.py shell +</code></pre><p>Have commands other Drycc contributors might find useful? Send us a PR!</p> +<h2 id="pull-requests">Pull Requests<a class="td-heading-self-link" href="#pull-requests" aria-label="Heading self-link"></a></h2> +<p>Satisfied with your changes? Share them!</p> +<p>Please read <a href="/docs/contribution-guidelines/submitting-a-pull-request/">Submitting a Pull Request</a>. It contains a checklist of +things you should do when proposing a change to any Drycc component.</p> + + + + + + Docs: Testing Drycc + /docs/contribution-guidelines/testing/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/testing/ + + + + <p>Each Drycc component includes its own suite of style checks, <a href="http://en.wikipedia.org/wiki/Unit_testing">unit tests</a>, and black-box type <a href="http://en.wikipedia.org/wiki/Functional_testing">functional tests</a>.</p> +<p><a href="http://en.wikipedia.org/wiki/Integration_testing">Integration tests</a> verify the behavior of the Drycc components together as a system and are provided separately by the <a href="https://github.com/drycc/workflow-e2e">drycc/workflow-e2e</a> project.</p> +<p>GitHub pull requests for all Drycc components are tested automatically by the <a href="https://travis-ci.org/drycc">Travis CI</a> <a href="http://en.wikipedia.org/wiki/Continuous_integration">continuous integration</a> system. Contributors should run the same tests locally before proposing any changes to the Drycc codebase.</p> +<h2 id="set-up-the-environment">Set Up the Environment<a class="td-heading-self-link" href="#set-up-the-environment" aria-label="Heading self-link"></a></h2> +<p>Successfully executing the unit and functional tests for any Drycc component requires that the <a href="/docs/contribution-guidelines/development-environment/">Development Environment</a> is set up first.</p> +<h2 id="run-the-tests">Run the Tests<a class="td-heading-self-link" href="#run-the-tests" aria-label="Heading self-link"></a></h2> +<p>The style checks, unit tests, and functional tests for each component can all be executed via make targets:</p> +<p>To execute style checks:</p> +<pre tabindex="0"><code>$ make test-style +</code></pre><p>To execute unit tests:</p> +<pre tabindex="0"><code>$ make test-unit +</code></pre><p>To execute functional tests:</p> +<pre tabindex="0"><code>$ make test-functional +</code></pre><p>To execute style checks, unit tests, and functional tests all in one shot:</p> +<pre tabindex="0"><code>$ make test +</code></pre><p>To execute integration tests, refer to <a href="https://github.com/drycc/workflow-e2e">drycc/workflow-e2e</a> documentation.</p> + + + + + + Docs: Submitting a Pull Request + /docs/contribution-guidelines/submitting-a-pull-request/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/submitting-a-pull-request/ + + + + <h2 id="design-document">Design Document<a class="td-heading-self-link" href="#design-document" aria-label="Heading self-link"></a></h2> +<p>Before opening a pull request, ensure your change also references a design document if the contribution is substantial. For more information, see <a href="/docs/contribution-guidelines/design-documents/">Design Documents</a>.</p> +<h2 id="single-issue">Single Issue<a class="td-heading-self-link" href="#single-issue" aria-label="Heading self-link"></a></h2> +<p>It&rsquo;s hard to reach agreement on the merit of a PR when it isn&rsquo;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.</p> +<p>Squash and rebase the commit or commits in your pull request into logical units of work with <code>git</code>. Include tests and documentation changes in the same commit, so that a revert would remove all traces of the feature or fix.</p> +<p>Most pull requests will reference a GitHub issue. In the PR description - not in the commit itself - include a line such as &ldquo;closes #1234&rdquo;. The issue referenced will automatically be closed when your PR is merged.</p> +<h2 id="include-tests">Include Tests<a class="td-heading-self-link" href="#include-tests" aria-label="Heading self-link"></a></h2> +<p>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 <a href="https://github.com/drycc/workflow-e2e">drycc/workflow-e2e</a> repository.</p> +<p>See <a href="/docs/contribution-guidelines/testing/">testing</a> for more information.</p> +<h2 id="include-docs">Include Docs<a class="td-heading-self-link" href="#include-docs" aria-label="Heading self-link"></a></h2> +<p>Changes to any Drycc Workflow component that could affect a user&rsquo;s experience also require a change or addition to the relevant documentation. For most Drycc components, this involves updating the component&rsquo;s <em>own</em> documentation. In some cases where a component is tightly integrated into <a href="https://github.com/drycc/workflow">drycc/workflow</a>, its documentation must also be updated.</p> +<h2 id="cross-repo-commits">Cross-repo commits<a class="td-heading-self-link" href="#cross-repo-commits" aria-label="Heading self-link"></a></h2> +<p>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 <a href="https://ci.drycc.info/job/workflow-e2e-pr/">e2e test job</a> 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.</p> +<p>For example, consider paired commits in <a href="https://github.com/drycc/controller">drycc/controller</a> and <a href="https://github.com/drycc/workflow-e2e">drycc/workflow-e2e</a>. The commit body for the first PR in <code>drycc/workflow-e2e</code> would look like:</p> +<pre tabindex="0"><code>feat(foo_test): add e2e test for feature foo + +[skip e2e] test for controller#42 +</code></pre><p>Adding <code>[skip e2e]</code> 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.</p> +<p>Lastly, the final PR in <code>drycc/controller</code> should be created with the required PR number(s) listed, in the form of <code>[Rr]equires &lt;repoName&gt;#&lt;pullRequestNumber&gt;</code>, for use by the downstream e2e run.</p> +<pre tabindex="0"><code>feat(foo): add feature foo + +Requires workflow-e2e#42 +</code></pre><h2 id="code-standards">Code Standards<a class="td-heading-self-link" href="#code-standards" aria-label="Heading self-link"></a></h2> +<p>Drycc components are implemented in <a href="http://golang.org/">Go</a> and <a href="http://www.python.org/">Python</a>. For both languages, we agree with <a href="http://www.python.org/dev/peps/pep-0020/">The Zen of Python</a>, which emphasizes simple over clever. Readability counts.</p> +<p>Go code should always be run through <code>gofmt</code> 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 <a href="https://github.com/Masterminds/glide">glide</a> tool.</p> +<p>Python code should always adhere to <a href="http://www.python.org/dev/peps/pep-0008/">PEP8</a>, 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 <a href="https://pypi.python.org/pypi/flake8/">flake8</a> tool used by Drycc does not enforce this.</p> +<h2 id="commit-style">Commit Style<a class="td-heading-self-link" href="#commit-style" aria-label="Heading self-link"></a></h2> +<p>We follow a convention for commit messages borrowed from CoreOS, who borrowed theirs +from AngularJS. This is an example of a commit:</p> +<pre tabindex="0"><code>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. +</code></pre><p>To make it more formal, it looks something like this:</p> +<pre tabindex="0"><code>{type}({scope}): {subject} +&lt;BLANK LINE&gt; +{body} +&lt;BLANK LINE&gt; +{footer} +</code></pre><p>The allowed <code>{types}</code> are as follows:</p> +<ul> +<li><code>feat</code> -&gt; feature</li> +<li><code>fix</code> -&gt; bug fix</li> +<li><code>docs</code> -&gt; documentation</li> +<li><code>style</code> -&gt; formatting</li> +<li><code>ref</code> -&gt; refactoring code</li> +<li><code>test</code> -&gt; adding missing tests</li> +<li><code>chore</code> -&gt; maintenance</li> +</ul> +<p>The <code>{scope}</code> can be anything specifying the location(s) of the commit change(s).</p> +<p>The <code>{subject}</code> 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.</p> +<p>Just like the <code>{subject}</code>, the message <code>{body}</code> 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.</p> +<p>All breaking changes need to be mentioned in the <code>{footer}</code> with the description of the +change, the justification behind the change and any migration notes required.</p> +<p>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.</p> +<h2 id="merge-approval">Merge Approval<a class="td-heading-self-link" href="#merge-approval" aria-label="Heading self-link"></a></h2> +<p>Any code change - other than a simple typo fix or one-line documentation change - requires at least two <a href="/docs/contribution-guidelines/maintainers/">Drycc maintainers</a> to accept it. Maintainers tag pull requests with &ldquo;<strong>LGTM1</strong>&rdquo; and &ldquo;<strong>LGTM2</strong>&rdquo; (Looks Good To Me) labels to indicate acceptance.</p> +<p>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.</p> +<p>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.</p> +<p>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.</p> + + + + + + Docs: Community + /docs/contribution-guidelines/community/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/community/ + + + + <p>Drycc software is fully open source. As such, the &ldquo;Drycc community&rdquo; 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.</p> +<p>Drycc development is coordinated through numerous project repositories <a href="https://github.com/drycc">on GitHub</a>. 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.</p> +<p><a href="https://www.drycc.cc/community">Engine Yard</a> 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.</p> +<p>Drycc uses the timeless, highly efficient, and totally unfair system known as &ldquo;Benevolent Dictator for Life&rdquo; (<a href="http://en.wikipedia.org/wiki/Benevolent_Dictator_for_Life">BDFL</a>). <a href="https://github.com/gabrtv">Gabriel Monroy</a>, the creator of Drycc, is our BDFL and has final say over all decisions related to Drycc.</p> +<h2 id="open-source-bounties">Open Source Bounties<a class="td-heading-self-link" href="#open-source-bounties" aria-label="Heading self-link"></a></h2> +<p>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.</p> + + + + + + Docs: Triaging Issues + /docs/contribution-guidelines/triaging-issues/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/triaging-issues/ + + + + <p>Triage helps ensure issues resolve quickly by:</p> +<ul> +<li>Describing the issue&rsquo;s intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences an problem and what actions they took.</li> +<li>Giving a contributor the information they need before they commit to resolving an issue.</li> +<li>Lowering the issue count by preventing duplicate issues.</li> +<li>Streamlining the development process by preventing duplicate discussions.</li> +</ul> +<p>If you don&rsquo;t have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours.</p> +<h2 id="ensure-the-issue-contains-basic-information">Ensure the Issue Contains Basic Information<a class="td-heading-self-link" href="#ensure-the-issue-contains-basic-information" aria-label="Heading self-link"></a></h2> +<p>Before triaging an issue very far, make sure that the issue&rsquo;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:</p> +<ul> +<li>the version(s) of Drycc this issue affects</li> +<li>a reproducible case if this is a bug</li> +<li>page URL if this is a docs issue or the name of a man page</li> +</ul> +<p>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.</p> +<p>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&rsquo;s time.</p> +<p>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.</p> +<h2 id="classifying-the-issue">Classifying the Issue<a class="td-heading-self-link" href="#classifying-the-issue" aria-label="Heading self-link"></a></h2> +<p>An issue can have multiple of the following labels:</p> +<h3 id="issue-kind">Issue Kind<a class="td-heading-self-link" href="#issue-kind" aria-label="Heading self-link"></a></h3> +<table> +<thead> +<tr> +<th>Kind</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>bug</td> +<td>Bugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate.</td> +</tr> +<tr> +<td>docs</td> +<td>Writing documentation, man pages, articles, blogs, or other significant word-driven task.</td> +</tr> +<tr> +<td>enhancement</td> +<td>Enhancements can drastically improve usability or performance of a component.</td> +</tr> +<tr> +<td>question</td> +<td>Contains a user or contributor question requiring a response.</td> +</tr> +<tr> +<td>security</td> +<td>Security-related issues such as TLS encryption, network segregation, authn/authz features, etc.</td> +</tr> +</tbody> +</table> +<h3 id="functional-area">Functional Area<a class="td-heading-self-link" href="#functional-area" aria-label="Heading self-link"></a></h3> +<ul> +<li>builder</li> +<li>cache</li> +<li>contrib and provisioning</li> +<li>client</li> +<li>controller</li> +<li>database</li> +<li>docs</li> +<li>kubernetes</li> +<li>registry</li> +<li>router</li> +<li>store (Ceph)</li> +<li>tests</li> +</ul> +<h2 id="easy-fix">Easy Fix<a class="td-heading-self-link" href="#easy-fix" aria-label="Heading self-link"></a></h2> +<p>&ldquo;Easy Fix&rdquo; 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.</p> +<h2 id="prioritizing-issues">Prioritizing issues<a class="td-heading-self-link" href="#prioritizing-issues" aria-label="Heading self-link"></a></h2> +<p>When attached to a specific milestone, an issue can be attributed one of the following labels to indicate their degree of priority.</p> +<table> +<thead> +<tr> +<th>Priority</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>priority 0</td> +<td>Urgent: Security, critical bugs, blocking issues. Drop everything and fix this today, then consider creating a patch release.</td> +</tr> +<tr> +<td>priority 1</td> +<td>Serious: Impedes user actions or is a regression. Fix this before the next planned release.</td> +</tr> +</tbody> +</table> +<p>And that&rsquo;s it. That should be all the information required for a new or existing contributor to come in an resolve an issue.</p> + + + + + + Docs: Conduct + /docs/contribution-guidelines/conduct/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/conduct/ + + + + <h1 id="conduct">Conduct<a class="td-heading-self-link" href="#conduct" aria-label="Heading self-link"></a></h1> +<p>The Drycc community welcomes and encourages participation by <strong>everyone</strong>.</p> +<p>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.</p> +<p>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:</p> +<ol> +<li> +<p><strong>Be welcoming, friendly, and patient.</strong></p> +</li> +<li> +<p><strong>Be considerate.</strong></p> +</li> +</ol> +<p>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&rsquo;re a world-wide community, so you might not be communicating in someone else&rsquo;s primary language.</p> +<ol start="3"> +<li><strong>Be respectful.</strong></li> +</ol> +<p>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.</p> +<ol start="4"> +<li><strong>Be careful in the words that you choose.</strong></li> +</ol> +<p>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.</p> +<p>(Thanks to the <a href="http://www.debian.org/intro/diversity">Debian</a> and <a href="https://www.djangoproject.com/conduct/">Django</a> communities for their text and +their inspiration.)</p> + + + + + + Docs: Drycc Maintainers + /docs/contribution-guidelines/maintainers/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/maintainers/ + + + + <h1 id="what-is-a-maintainer">What is a maintainer?<a class="td-heading-self-link" href="#what-is-a-maintainer" aria-label="Heading self-link"></a></h1> +<p>(Unabashedly stolen from the <a href="https://github.com/containers/podman/blob/master/MAINTAINERS">Podman</a> project)</p> +<p>There are different types of maintainers, with different responsibilities, but +all maintainers have 3 things in common:</p> +<ol> +<li>They share responsibility in the project&rsquo;s success.</li> +<li>They have made a long-term, recurring time investment to improve the project.</li> +<li>They spend that time doing whatever needs to be done, not necessarily what +is the most interesting or fun.</li> +</ol> +<p>Maintainers are often under-appreciated, because their work is harder to appreciate. +It&rsquo;s easy to appreciate a really cool and technically advanced feature. It&rsquo;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.</p> +<h1 id="drycc-maintainers">Drycc maintainers<a class="td-heading-self-link" href="#drycc-maintainers" aria-label="Heading self-link"></a></h1> +<p>Drycc has two groups of maintainers in addition to our beloved Benevolent Dictator for Life.</p> +<h2 id="bdfl">BDFL<a class="td-heading-self-link" href="#bdfl" aria-label="Heading self-link"></a></h2> +<p>Drycc follows the timeless, highly efficient and totally unfair system known as <a href="http://en.wikipedia.org/wiki/Benevolent_Dictator_for_Life">Benevolent dictator +for life</a>.</p> +<p>Gabriel Monroy (<a href="https://github.com/gabrtv">@gabrtv</a>), as creator of the Drycc project, serves as our +project&rsquo;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.</p> +<h2 id="core-maintainers">Core maintainers<a class="td-heading-self-link" href="#core-maintainers" aria-label="Heading self-link"></a></h2> +<p>Core maintainers are exceptionally knowledgeable about all areas of Drycc. Some maintainers work on Drycc +full-time, although this is not a requirement.</p> +<p>The duties of a core maintainer include:</p> +<ul> +<li>Classify and respond to GitHub issues and review pull requests</li> +<li>Help to shape the Drycc roadmap and lead efforts to accomplish roadmap milestones</li> +<li>Participate actively in feature development and bug fixing</li> +<li>Answer questions and help users in the <a href="https://slack.drycc.cc">Drycc #community Slack channel</a></li> +</ul> +<p>The current list of core maintainers can be seen <a href="https://github.com/orgs/drycc/teams/core-maintainers">here</a>.</p> +<p>No pull requests can be merged until at least one core maintainer signs off with an +<a href="http://docs.drycc.cc/en/latest/contributing/standards/#merge-approval">LGTM</a>. The other LGTM can +come from either a core maintainer or contributing maintainer.</p> +<h2 id="contributing-maintainers">Contributing maintainers<a class="td-heading-self-link" href="#contributing-maintainers" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>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.</p> +<p>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.</p> +<h2 id="becoming-a-maintainer">Becoming a maintainer<a class="td-heading-self-link" href="#becoming-a-maintainer" aria-label="Heading self-link"></a></h2> +<p>The Drycc project wouldn&rsquo;t be where it is today without its community. Many of the project&rsquo;s +community members embody the spirit of maintainership, and have contributed substantially to +the project.</p> +<p>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.</p> +<p>Generally, potential contributing maintainers are selected by the Drycc core maintainers based in +part on the following criteria:</p> +<ul> +<li>Sustained contributions to the project over a period of time (usually months)</li> +<li>A willingness to help Drycc users on GitHub and in the <a href="https://slack.drycc.cc">Drycc #community Slack channel</a></li> +<li>A friendly attitude :)</li> +</ul> +<p>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.</p> + + + + + + diff --git a/docs/contribution-guidelines/maintainers/index.html b/docs/contribution-guidelines/maintainers/index.html new file mode 100644 index 000000000..9ae490ecb --- /dev/null +++ b/docs/contribution-guidelines/maintainers/index.html @@ -0,0 +1,525 @@ + + + + + + + + + + + + + + + + + + + +Drycc Maintainers | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Drycc Maintainers

+
This document serves to describe the leadership structure of the Drycc project, and list the current project maintainers.
+ +

What is a maintainer?

+

(Unabashedly stolen from the Podman project)

+

There are different types of maintainers, with different responsibilities, but +all maintainers have 3 things in common:

+
    +
  1. They share responsibility in the project’s success.
  2. +
  3. They have made a long-term, recurring time investment to improve the project.
  4. +
  5. They spend that time doing whatever needs to be done, not necessarily what +is the most interesting or fun.
  6. +
+

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 maintainers

+

Drycc has two groups of maintainers in addition to our beloved Benevolent Dictator for Life.

+

BDFL

+

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

+

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:

+
    +
  • Classify and respond to GitHub issues and review pull requests
  • +
  • Help to shape the Drycc roadmap and lead efforts to accomplish roadmap milestones
  • +
  • Participate actively in feature development and bug fixing
  • +
  • Answer questions and help users in the Drycc #community Slack channel
  • +
+

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

+

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.

+

Becoming a maintainer

+

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:

+
    +
  • Sustained contributions to the project over a period of time (usually months)
  • +
  • A willingness to help Drycc users on GitHub and in the Drycc #community Slack channel
  • +
  • A friendly attitude :)
  • +
+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/contribution-guidelines/overview/index.html b/docs/contribution-guidelines/overview/index.html new file mode 100644 index 000000000..9bd23fee5 --- /dev/null +++ b/docs/contribution-guidelines/overview/index.html @@ -0,0 +1,479 @@ + + + + + + + + + + + + + + + + + + + +Contributor Overview | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Contributor Overview

+
Interested in contributing to a Drycc project? There are lots of ways to help.
+ +

File Bugs & Enhancements

+

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.

+

Write Documentation

+

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.

+

Contribute Code

+

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.

+

Triage Issues

+

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.

+

Share your Experience

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/contribution-guidelines/submitting-a-pull-request/index.html b/docs/contribution-guidelines/submitting-a-pull-request/index.html new file mode 100644 index 000000000..7538deba7 --- /dev/null +++ b/docs/contribution-guidelines/submitting-a-pull-request/index.html @@ -0,0 +1,531 @@ + + + + + + + + + + + + + + + + + + + +Submitting a Pull Request | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Submitting a Pull Request

+
Proposed changes to Drycc projects are made as GitHub pull requests.
+ +

Design Document

+

Before opening a pull request, ensure your change also references a design document if the contribution is substantial. For more information, see Design Documents.

+

Single Issue

+

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.

+

Include Tests

+

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.

+

Include Docs

+

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.

+

Cross-repo commits

+

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
+

Code Standards

+

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.

+

Commit Style

+

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 -> feature
  • +
  • fix -> bug fix
  • +
  • docs -> documentation
  • +
  • style -> formatting
  • +
  • ref -> refactoring code
  • +
  • test -> adding missing tests
  • +
  • chore -> maintenance
  • +
+

The {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.

+

Merge Approval

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/contribution-guidelines/testing/index.html b/docs/contribution-guidelines/testing/index.html new file mode 100644 index 000000000..700c5122c --- /dev/null +++ b/docs/contribution-guidelines/testing/index.html @@ -0,0 +1,476 @@ + + + + + + + + + + + + + + + + + + + +Testing Drycc | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Testing Drycc

+
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.
+ +

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.

+

Set Up the Environment

+

Successfully executing the unit and functional tests for any Drycc component requires that the Development Environment is set up first.

+

Run the Tests

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/contribution-guidelines/triaging-issues/index.html b/docs/contribution-guidelines/triaging-issues/index.html new file mode 100644 index 000000000..00584beea --- /dev/null +++ b/docs/contribution-guidelines/triaging-issues/index.html @@ -0,0 +1,556 @@ + + + + + + + + + + + + + + + + + + + +Triaging Issues | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Triaging Issues

+
Issue triage provides an important way to contribute to an open source project.
+ +

Triage helps ensure issues resolve quickly by:

+
    +
  • Describing the issue’s intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences an problem and what actions they took.
  • +
  • Giving a contributor the information they need before they commit to resolving an issue.
  • +
  • Lowering the issue count by preventing duplicate issues.
  • +
  • Streamlining the development process by preventing duplicate discussions.
  • +
+

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.

+

Ensure the Issue Contains Basic Information

+

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:

+
    +
  • the version(s) of Drycc this issue affects
  • +
  • a reproducible case if this is a bug
  • +
  • page URL if this is a docs issue or the name of a man page
  • +
+

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.

+

Classifying the Issue

+

An issue can have multiple of the following labels:

+

Issue Kind

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KindDescription
bugBugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate.
docsWriting documentation, man pages, articles, blogs, or other significant word-driven task.
enhancementEnhancements can drastically improve usability or performance of a component.
questionContains a user or contributor question requiring a response.
securitySecurity-related issues such as TLS encryption, network segregation, authn/authz features, etc.
+

Functional Area

+
    +
  • builder
  • +
  • cache
  • +
  • contrib and provisioning
  • +
  • client
  • +
  • controller
  • +
  • database
  • +
  • docs
  • +
  • kubernetes
  • +
  • registry
  • +
  • router
  • +
  • store (Ceph)
  • +
  • tests
  • +
+

Easy Fix

+

“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.

+

Prioritizing issues

+

When attached to a specific milestone, an issue can be attributed one of the following labels to indicate their degree of priority.

+ + + + + + + + + + + + + + + + + +
PriorityDescription
priority 0Urgent: Security, critical bugs, blocking issues. Drop everything and fix this today, then consider creating a patch release.
priority 1Serious: 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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/diagrams/Application_Layout.png b/docs/diagrams/Application_Layout.png new file mode 100644 index 000000000..c52cd7cc5 Binary files /dev/null and b/docs/diagrams/Application_Layout.png differ diff --git a/docs/diagrams/Diagrams.graffle b/docs/diagrams/Diagrams.graffle new file mode 100644 index 000000000..ccea9786a Binary files /dev/null and b/docs/diagrams/Diagrams.graffle differ diff --git a/docs/diagrams/Ecosystem_Basic.jpg b/docs/diagrams/Ecosystem_Basic.jpg new file mode 100644 index 000000000..92507abc2 Binary files /dev/null and b/docs/diagrams/Ecosystem_Basic.jpg differ diff --git a/docs/diagrams/Ecosystem_Complex.png b/docs/diagrams/Ecosystem_Complex.png new file mode 100644 index 000000000..5dbeb7f7a Binary files /dev/null and b/docs/diagrams/Ecosystem_Complex.png differ diff --git a/docs/diagrams/Git_Push_Flow.png b/docs/diagrams/Git_Push_Flow.png new file mode 100644 index 000000000..096bcfe68 Binary files /dev/null and b/docs/diagrams/Git_Push_Flow.png differ diff --git a/docs/diagrams/Workflow_Detail.png b/docs/diagrams/Workflow_Detail.png new file mode 100644 index 000000000..fe4980009 Binary files /dev/null and b/docs/diagrams/Workflow_Detail.png differ diff --git a/docs/diagrams/Workflow_Overview.jpg b/docs/diagrams/Workflow_Overview.jpg new file mode 100644 index 000000000..fe37885ea Binary files /dev/null and b/docs/diagrams/Workflow_Overview.jpg differ diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000..a34c01194 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,537 @@ + + + + + + + + + + + + + + + + + + + + + +Docs | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Docs

+ + + + +
+

A Open, Unified, Lightweight, Simpler Containers as a Service (CaaS).

+ +
+ +

Welcome to Drycc

+

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.

+

Getting Started

+

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!

+ +
+ + +
+
+
+ Quick Start +
+

Step-by-step guides for deploying your first app and mastering the basics of Drycc.

+
+
+
+ Understanding Workflow +
+

Understanding the architecture design of workflow.

+
+
+
+ Installing To Kubenetes +
+

Deploying Drycc on a Kubernetes Cluster.

+
+
+
+ Users +
+

In this tutorial, you’ll learn how to manage users.

+
+
+
+ Applications +
+

A simple and scalable cloud platform for all developer needs.

+
+
+
+ Managing Workflow +
+

Managing Workflow using the kubectl.

+
+
+
+ Troubleshooting +
+

Troubleshooting is systematic approach to problem-solving.

+
+
+
+ Roadmap +
+

Browse the ever-growing list of up-to-date, community driven roadmaps.

+
+
+
+ Contribution Guidelines +
+

This HowTo is for project maintainers who need a Contributing Guide for their project.

+
+
+
+ Reference Guide +
+

Reference gxwuide definition and meaning.

+
+
+ +
+ + + + + + +
+ +
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/index.xml b/docs/index.xml new file mode 100644 index 000000000..df97967a2 --- /dev/null +++ b/docs/index.xml @@ -0,0 +1,8080 @@ + + + Drycc – Docs + /docs/ + Recent content in Docs on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Docs: Drycc Workflow CLI + /docs/users/cli/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/users/cli/ + + + + <p>The Drycc Workflow command-line interface (CLI), or client, allows you to interact +with Drycc Workflow.</p> +<h2 id="installation">Installation<a class="td-heading-self-link" href="#installation" aria-label="Heading self-link"></a></h2> +<p>Install the latest <code>drycc</code> client for Linux or Mac OS X with: +$ curl -sfL <a href="https://www.drycc.cc/install-cli.sh">https://www.drycc.cc/install-cli.sh</a> | bash -</p> +<p>The installer puts <code>drycc</code> in your current directory, but you should move it +somewhere in your $PATH:</p> +<pre><code>$ ln -fs $PWD/drycc /usr/local/bin/drycc +</code></pre> +<h2 id="getting-help">Getting Help<a class="td-heading-self-link" href="#getting-help" aria-label="Heading self-link"></a></h2> +<p>The Drycc client comes with comprehensive documentation for every command. +Use <code>drycc help</code> to explore the commands available to you:</p> +<pre><code>$ drycc help +The Drycc command-line client issues API calls to a Drycc controller. + +Usage: drycc &lt;command&gt; [&lt;args&gt;...] + +Auth commands:: + + login login to a controller + logout logout from the current controller + +Subcommands, use `drycc help [subcommand]` to learn more:: +... +</code></pre> +<p>To get help on subcommands, use <code>drycc help [subcommand]</code>:</p> +<pre><code>$ 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 +</code></pre> +<h2 id="support-for-multiple-profiles">Support for Multiple Profiles<a class="td-heading-self-link" href="#support-for-multiple-profiles" aria-label="Heading self-link"></a></h2> +<p>The CLI reads from the default <code>client</code> profile, which is located on your +workstation at <code>$HOME/.drycc/client.json</code>.</p> +<p>Easily switch between multiple Drycc Workflow installations or users by setting +the <code>$DRYCC_PROFILE</code> environment variable or by using the <code>-c</code> flag.</p> +<p>There are two ways to set the <code>$DRYCC_PROFILE</code> option.</p> +<ol> +<li>Path to a json configuration file.</li> +<li>Profile name. If you set profile to just a name, it will be saved alongside the default profile, +in <code>$HOME/.drycc/&lt;name&gt;.json</code>.</li> +</ol> +<p>Examples:</p> +<pre><code>$ 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 +</code></pre> +<p>The configuration flag works identically to and overrides <code>$DRYCC_PROFILE</code>:</p> +<pre><code>$ drycc whoami -c ~/config.json +You are drycc at drycc.example.com +</code></pre> +<h2 id="proxy-support">Proxy Support<a class="td-heading-self-link" href="#proxy-support" aria-label="Heading self-link"></a></h2> +<p>If your workstation uses a proxy to reach the network where the cluster lies, +set the <code>http_proxy</code> or <code>https_proxy</code> environment variable to enable proxy support:</p> +<pre><code>$ export http_proxy=&quot;http://proxyip:port&quot; +$ export https_proxy=&quot;http://proxyip:port&quot; +</code></pre> +<p>!!! note +Configuring a proxy is generally not necessary for local Minikube clusters.</p> +<h2 id="cli-plugins">CLI Plugins<a class="td-heading-self-link" href="#cli-plugins" aria-label="Heading self-link"></a></h2> +<p>Plugins allow developers to extend the functionality of the Drycc Client, adding new commands or features.</p> +<p>If an unknown command is specified, the client will attempt to execute the command as a dash-separated command. In this case, <code>drycc resource:command</code> will execute <code>drycc-resource</code> with the argument list <code>command</code>. In full form:</p> +<pre><code>$ # these two are identical +$ drycc accounts:list +$ drycc-accounts list +</code></pre> +<p>Any flags after the command will also be sent to the plugin as an argument:</p> +<pre><code>$ # these two are identical +$ drycc accounts:list --debug +$ drycc-accounts list --debug +</code></pre> +<p>But flags preceding the command will not:</p> +<pre><code>$ # these two are identical +$ drycc --debug accounts:list +$ drycc-accounts list +</code></pre> + + + + + + Docs: Concepts + /docs/understanding-workflow/concepts/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/understanding-workflow/concepts/ + + + + <h2 id="twelve-factor-applications">Twelve-Factor Applications<a class="td-heading-self-link" href="#twelve-factor-applications" aria-label="Heading self-link"></a></h2> +<p>The <a href="http://12factor.net/">Twelve-Factor App</a> is a methodology for building modern +applications that can be scaled across a distributed system.</p> +<p>Twelve-factor is a valuable synthesis of years of experience with +software-as-a-service apps in the wild, particularly on the +Heroku platform.</p> +<p>Workflow is designed to run applications that adhere to the <a href="http://12factor.net/">Twelve-Factor App</a> +methodology and best practices.</p> +<h2 id="kubernetes">Kubernetes<a class="td-heading-self-link" href="#kubernetes" aria-label="Heading self-link"></a></h2> +<p><a href="https://kubernetes.io">Kubernetes</a> is an open-source cluster manager developed by Google and +donated to the <a href="https://cncf.io/">Cloud Native Compute Foundation</a>. Kubernetes manages all +the activity on your cluster, including: desired state convergence, stable +service addresses, health monitoring, service discovery, and DNS resolution.</p> +<p>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.</p> +<p>Drycc Workflow is a set of Kubernetes-native components, installable via +<a href="https://github.com/kubernetes/helm">Helm</a>. Systems engineers who are familiar with Kubernetes will feel right +at home running Workflow.</p> +<p>See the <a href="/docs/understanding-workflow/components/">components</a> overview for more detail.</p> +<h2 id="container">Container<a class="td-heading-self-link" href="#container" aria-label="Heading self-link"></a></h2> +<p>[Container][] is an open source project to build, ship and run any +application as a lightweight, portable, self-sufficient container.</p> +<p>If you have not yet converted your application to containers, Workflow provides +a simple and straightforward &ldquo;source to Container image&rdquo; capability. Supporting +multiple language runtimes via community <a href="/docs/applications/using-buildpacks/">buildpacks</a>, building your application +in a container can be as easy as <code>git push drycc master</code>.</p> +<p>Applications which use either a Dockerfile or reference external Container +images are launched unmodified.</p> +<h2 id="applications">Applications<a class="td-heading-self-link" href="#applications" aria-label="Heading self-link"></a></h2> +<p>Workflow is designed around the concept of an <a href="../reference-guide/terms.md#application">application</a>, or app.</p> +<p>Applications come in one of three forms:</p> +<ol> +<li>a collection of source files stored in a <code>git</code> repository</li> +<li>a Dockerfile and associated source files stored in a <code>git</code> repository</li> +<li>a reference to an existing image at a Container repository</li> +</ol> +<p>Applications 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.</p> +<h2 id="build-release-run">Build, Release, Run<a class="td-heading-self-link" href="#build-release-run" aria-label="Heading self-link"></a></h2> +<p><img alt="Git Push Workflow" src="../../diagrams/Git_Push_Flow.png"></p> +<h3 id="build-stage">Build Stage<a class="td-heading-self-link" href="#build-stage" aria-label="Heading self-link"></a></h3> +<p>The <a href="/docs/understanding-workflow/components/#builder">builder</a> component processes incoming <code>git push drycc master</code> requests +and manages your application packaging.</p> +<p>If your application is using a <a href="/docs/applications/using-buildpacks/">buildpack</a>, 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.</p> +<p>If instead builder finds a <a href="/docs/applications/using-dockerfiles/">Dockerfile</a>, 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.</p> +<p>If another system already builds and packages your application, that container +artifact can be used directly. When referencing an <a href="/docs/applications/using-container-images/">external Container +image</a>, the builder component doesn&rsquo;t attempt to repackage your +app.</p> +<h3 id="release-stage">Release Stage<a class="td-heading-self-link" href="#release-stage" aria-label="Heading self-link"></a></h3> +<p>During the release stage, a <a href="../reference-guide/terms.md#build">build</a> is combined with <a href="../reference-guide/terms.md#config">application configuration</a> +to create a new, numbered <a href="../reference-guide/terms.md#release">release</a>. New releases are created any time a new +build is created or application configuration is changed. Tracking releases as a +&ldquo;write-only ledger&rdquo; this way makes it easy to rollback to any previous release.</p> +<h3 id="run-stage">Run Stage<a class="td-heading-self-link" href="#run-stage" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<h2 id="backing-services">Backing Services<a class="td-heading-self-link" href="#backing-services" aria-label="Heading self-link"></a></h2> +<p>Workflow treats all persistent services such as databases, caches, storage, +messaging systems, and other <a href="http://12factor.net/backing-services">backing services</a> as resources managed +separately from your application. This philosophy aligns with Twelve-Factor +best practices.</p> +<p>Applications attach to backing services using <a href="http://12factor.net/config">environment variables</a>. +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.</p> +<h2 id="see-also">See Also<a class="td-heading-self-link" href="#see-also" aria-label="Heading self-link"></a></h2> +<ul> +<li><a href="/docs/understanding-workflow/architecture/">Workflow Architecture</a></li> +<li><a href="/docs/understanding-workflow/components/">Workflow Components</a></li> +</ul> + + + + + + Docs: Creating a Self-Signed SSL Certificate + /docs/reference-guide/creating-a-self-signed-ssl-certificate/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/reference-guide/creating-a-self-signed-ssl-certificate/ + + + + <p>When <a href="/docs/applications/ssl-certificates/">using the app ssl</a> feature for non-production applications or when <a href="https://gateway-api.sigs.k8s.io/guides/tls/">installing SSL for the platform</a>, 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.</p> +<h2 id="prerequisites">Prerequisites<a class="td-heading-self-link" href="#prerequisites" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<pre><code>$ which openssl +/usr/bin/openssl +</code></pre> +<p>If the which command does not return a path then you will need to install openssl yourself:</p> +<table> +<thead> +<tr> +<th>If you have&hellip;</th> +<th>Install with&hellip;</th> +</tr> +</thead> +<tbody> +<tr> +<td>Mac OS X</td> +<td>Homebrew: <code>brew install openssl</code></td> +</tr> +<tr> +<td>Windows</td> +<td>complete package .exe installed</td> +</tr> +<tr> +<td>Ubuntu Linux</td> +<td><code>apt-get install openssl</code></td> +</tr> +</tbody> +</table> +<h2 id="generate-private-key-and-certificate-signing-request">Generate Private Key and Certificate Signing Request<a class="td-heading-self-link" href="#generate-private-key-and-certificate-signing-request" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<pre><code>$ 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 []: +... +</code></pre> +<h2 id="generate-ssl-certificate">Generate SSL Certificate<a class="td-heading-self-link" href="#generate-ssl-certificate" aria-label="Heading self-link"></a></h2> +<p>The self-signed SSL certificate is generated from the server.key private key and server.csr files.</p> +<pre><code>$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt +</code></pre> +<p>The server.crt file is your site certificate suitable for use with <a href="/docs/applications/ssl-certificates/">Drycc&rsquo;s SSL endpoint</a> along with the server.key private key.</p> + + + + + + Docs: Deploying an Application + /docs/applications/deploying-apps/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/deploying-apps/ + + + + <p>An <a href="../reference-guide/terms.md#application">Application</a> is deployed to Drycc using <code>git push</code> or the <code>drycc</code> client.</p> +<h2 id="supported-applications">Supported Applications<a class="td-heading-self-link" href="#supported-applications" aria-label="Heading self-link"></a></h2> +<p>Drycc Workflow can deploy any application or service that can run inside a container. In order to be scaled +horizontally, applications must follow the <a href="http://12factor.net/">Twelve-Factor App</a> methodology and store any application state in external +backing services.</p> +<p>For example, if your application persists state to the local filesystem &ndash; common with content management systems like +Wordpress and Drupal &ndash; it cannot be scaled horizontally using <code>drycc scale</code>.</p> +<p>Fortunately, most modern applications feature a stateless application tier that can scale horizontally inside Drycc.</p> +<h2 id="login-to-the-controller">Login to the Controller<a class="td-heading-self-link" href="#login-to-the-controller" aria-label="Heading self-link"></a></h2> +<p>!!! important +if you haven&rsquo;t yet, now is a good time to <a href="/docs/users/cli/#installation">install the client</a> and <a href="/docs/users/registration/">register</a>.</p> +<p>Before deploying an application, users must first authenticate against the Drycc <a href="/docs/understanding-workflow/components/#controller">Controller</a> +using the URL supplied by their Drycc administrator.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Or you can login with username and password</p> +<pre tabindex="0"><code>$ drycc login http://drycc.example.com --username=demo --password=demo +Configuration file written to /root/.drycc/client.json +</code></pre><h2 id="select-a-build-process">Select a Build Process<a class="td-heading-self-link" href="#select-a-build-process" aria-label="Heading self-link"></a></h2> +<p>Drycc Workflow supports three different ways of building applications:</p> +<h3 id="buildpacks">Buildpacks<a class="td-heading-self-link" href="#buildpacks" aria-label="Heading self-link"></a></h3> +<p>Cloud Native Buildpacks are useful if you want to follow <a href="https://buildpacks.io/docs/">cnb&rsquo;s docs</a> for building applications.</p> +<p>Learn how to deploy applications <a href="/docs/applications/using-buildpacks/">using Buildpacks</a>.</p> +<h3 id="dockerfiles">Dockerfiles<a class="td-heading-self-link" href="#dockerfiles" aria-label="Heading self-link"></a></h3> +<p>Dockerfiles are a powerful way to define a portable execution environment built on a base OS of your choosing.</p> +<p>Learn how to deploy applications <a href="/docs/applications/using-dockerfiles/">using Dockerfiles</a>.</p> +<h3 id="container-image">Container Image<a class="td-heading-self-link" href="#container-image" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p>Learn how to deploy applications <a href="/docs/applications/using-container-images/">using Container images</a>.</p> +<h2 id="tuning-application-settings">Tuning Application Settings<a class="td-heading-self-link" href="#tuning-application-settings" aria-label="Heading self-link"></a></h2> +<p>It is possible to configure a few of the <a href="/docs/applications/managing-app-configuration/">globally tunable</a> settings on per application basis using <code>config:set</code>.</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>DRYCC_DISABLE_CACHE</td> +<td>if set, this will disable the [imagebuilder cache][] (default: not set)</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_BATCHES</td> +<td>the number of pods to bring up and take down sequentially during a scale (default: number of available nodes)</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_TIMEOUT</td> +<td>deploy timeout in seconds per deploy batch (default: 120)</td> +</tr> +<tr> +<td>IMAGE_PULL_POLICY</td> +<td>the kubernetes [image pull policy][pull-policy] for application images (default: &ldquo;IfNotPresent&rdquo;) (allowed values: &ldquo;Always&rdquo;, &ldquo;IfNotPresent&rdquo;)</td> +</tr> +<tr> +<td>KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT</td> +<td>how many <a href="http://kubernetes.io/docs/user-guide/deployments/#revision-history-limit">revisions</a> Kubernetes keeps around of a given Deployment (default: all revisions)</td> +</tr> +<tr> +<td>KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS</td> +<td>how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30)</td> +</tr> +</tbody> +</table> +<h3 id="deploy-timeout">Deploy Timeout<a class="td-heading-self-link" href="#deploy-timeout" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<h4 id="deployments">Deployments<a class="td-heading-self-link" href="#deployments" aria-label="Heading self-link"></a></h4> +<p>Deployments behave a little bit differently from the RC based deployment strategy.</p> +<p>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.</p> +<p>The base timeout is multiplied with <code>DRYCC_DEPLOY_BATCHES</code> to create an overall timeout. This would be 240 (timeout) * 4 (batches) = 960 second overall timeout.</p> +<h4 id="rc-deploy">RC deploy<a class="td-heading-self-link" href="#rc-deploy" aria-label="Heading self-link"></a></h4> +<p>This deploy timeout defines how long to wait for each batch to complete in <code>DRYCC_DEPLOY_BATCHES</code>.</p> +<h4 id="additions-to-the-base-timeout">Additions to the base timeout<a class="td-heading-self-link" href="#additions-to-the-base-timeout" aria-label="Heading self-link"></a></h4> +<p>The base timeout is extended as well with healthchecks using <code>initialDelaySeconds</code> on <code>liveness</code> and <code>readiness</code> 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.</p> +<h3 id="deployments-1">Deployments<a class="td-heading-self-link" href="#deployments-1" aria-label="Heading self-link"></a></h3> +<p>Workflow uses <a href="http://kubernetes.io/docs/user-guide/deployments/">Deployments</a> for deploys. In prior versions <a href="http://kubernetes.io/docs/user-guide/replication-controller/">ReplicationControllers</a> were used with the ability to turn on Deployments via <code>DRYCC_KUBERNETES_DEPLOYMENTS=1</code>.</p> +<p>The advantage of <a href="http://kubernetes.io/docs/user-guide/deployments/">Deployments</a> 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.</p> +<p>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.</p> +<p>Drycc Workflow will behave the same way with <code>DRYCC_KUBERNETES_DEPLOYMENTS</code> 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 <code>drycc ps:list</code> will output Pod names differently.</p> + + + + + + Docs: Quick Start + /docs/quickstart/overview/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/quickstart/overview/ + + + + <p>Get started with Drycc Workflow in three easy steps.</p> +<ol> +<li>Install CLI tools for Helm and Drycc Workflow</li> +<li>Boot a Kubernetes and install Drycc Workflow</li> +<li>Deploy your first application</li> +</ol> +<p>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 <a href="/docs/managing-workflow/production-deployments/">production checklist</a>.</p> +<h2 id="step-1-install-workflow">Step 1: Install Workflow<a class="td-heading-self-link" href="#step-1-install-workflow" aria-label="Heading self-link"></a></h2> +<p>For the quickstart we will <a href="/docs/quickstart/install-workflow/">install Drycc Workflow</a>.</p> +<h2 id="step-2-install-cli-tools">Step 2: Install CLI tools<a class="td-heading-self-link" href="#step-2-install-cli-tools" aria-label="Heading self-link"></a></h2> +<p>For the quickstart we will <a href="/docs/quickstart/install-cli-tools/">install Drycc Workflow CLI</a>.</p> +<h2 id="step-3-deploy-your-first-app">Step 3: Deploy your first app<a class="td-heading-self-link" href="#step-3-deploy-your-first-app" aria-label="Heading self-link"></a></h2> +<p>Last but not least, <a href="/docs/quickstart/deploy-an-app/">login and deploy your first application</a>.</p> + + + + + + Docs: Contributor Overview + /docs/contribution-guidelines/overview/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/overview/ + + + + <h2 id="file-bugs--enhancements">File Bugs &amp; Enhancements<a class="td-heading-self-link" href="#file-bugs--enhancements" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>Our official support channel is the <a href="https://slack.drycc.cc">Drycc #community Slack channel</a>.</p> +<p>Don&rsquo;t know what the applicable repository for an issue is? Open up in issue in <a href="https://github.com/drycc/workflow">workflow</a> or chat with a maintainer in the <a href="https://slack.drycc.cc">Drycc #community Slack channel</a> and we&rsquo;ll make sure it gets to the right place.</p> +<p>Additionally, take a look at the <a href="/docs/troubleshooting/">troubleshooting</a> documentation for common issues.</p> +<p>Before opening a new issue, it&rsquo;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 <a href="https://github.com/pulls?utf8=%E2%9C%93&q=user%3Adrycc+user%3Ahelm">here</a>.</p> +<h2 id="write-documentation">Write Documentation<a class="td-heading-self-link" href="#write-documentation" aria-label="Heading self-link"></a></h2> +<p>We are always looking to improve and expand our documentation. Most docs reside in the <a href="https://github.com/drycc/workflow">drycc/workflow</a> repository. Simply fork the project, update docs and send us a pull request.</p> +<h2 id="contribute-code">Contribute Code<a class="td-heading-self-link" href="#contribute-code" aria-label="Heading self-link"></a></h2> +<p>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 <a href="https://slack.drycc.cc">Drycc #community Slack channel</a>. Make sure to check out issues tagged <a href="https://github.com/pulls?utf8=%E2%9C%93&q=user%3Adrycc+label%3A%22easy+fix%22+is%3Aopen">easy fix</a> or <a href="https://github.com/pulls?utf8=%E2%9C%93&q=user%3Adrycc+label%3A%22help+wanted%22+is%3Aopen">help wanted</a>.</p> +<p>When you&rsquo;re ready to begin writing code, review <a href="/docs/contribution-guidelines/design-documents/">Design Documents</a> and get your <a href="/docs/contribution-guidelines/development-environment/">Development Environment</a> set up.</p> +<p>By contributing to any Drycc project you agree to its <a href="https://github.com/drycc/workflow/blob/main/DCO">Developer Certificate of Origin (DCO)</a>. 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.</p> +<h2 id="triage-issues">Triage Issues<a class="td-heading-self-link" href="#triage-issues" aria-label="Heading self-link"></a></h2> +<p>If you don&rsquo;t have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours. See <a href="/docs/contribution-guidelines/triaging-issues/">Triaging Issues</a> for more info.</p> +<h2 id="share-your-experience">Share your Experience<a class="td-heading-self-link" href="#share-your-experience" aria-label="Heading self-link"></a></h2> +<p>Interact with the community on our user mailing list or live in our <a href="https://slack.drycc.cc">Drycc #community Slack channel</a>, where you can chat with other Drycc Workflow users any time of day.</p> + + + + + + Docs: Planning Process + /docs/roadmap/planning-process/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/roadmap/planning-process/ + + + + <h2 id="the-role-of-maintainers">The Role of Maintainers<a class="td-heading-self-link" href="#the-role-of-maintainers" aria-label="Heading self-link"></a></h2> +<p><a href="../contributing/maintainers.md">Maintainers</a> lead the Drycc projects. Their duties include proposing the Roadmap, reviewing and integrating contributions and maintaining the vision of the project.</p> +<h2 id="open-roadmap">Open Roadmap<a class="td-heading-self-link" href="#open-roadmap" aria-label="Heading self-link"></a></h2> +<p>The <a href="/docs/roadmap/roadmap/">Drycc Roadmap</a> is a community document. While Maintainers propose the Roadmap, it gets discussed and refined in Release Planning Meetings.</p> +<h2 id="contributing-to-the-roadmap">Contributing to the Roadmap<a class="td-heading-self-link" href="#contributing-to-the-roadmap" aria-label="Heading self-link"></a></h2> +<p>Proposals and issues can be opened by anyone. Every member of the <a href="../contributing/community.md">community</a> is welcome to participate in the discussion by providing feedback and/or offering counter-proposals.</p> +<h2 id="release-milestones">Release Milestones<a class="td-heading-self-link" href="#release-milestones" aria-label="Heading self-link"></a></h2> +<p>The Roadmap gets delivered progressively via the <a href="/docs/roadmap/releases/">Release Schedule</a>. Releases are defined during Release Planning Meetings and managed using GitHub Milestones which track specific deliverables and work-in-progress.</p> +<h2 id="release-planning-meetings">Release Planning Meetings<a class="td-heading-self-link" href="#release-planning-meetings" aria-label="Heading self-link"></a></h2> +<p>Major decisions affecting the Roadmap are discussed during Release Planning Meetings on the first Thursday of each month, aligned with the <a href="/docs/roadmap/releases/">Release Schedule</a>.</p> +<p>Release Planning Meetings are open to the public with access coordinated via the <a href="https://slack.drycc.cc">Drycc #community Slack channel</a>. +Notes from past meetings are below, along with links to a recording of the entire meeting on YouTube.</p> +<h2 id="credits">Credits<a class="td-heading-self-link" href="#credits" aria-label="Heading self-link"></a></h2> +<p>Thanks to <a href="https://twitter.com/amylindburg">Amy Lindburg</a> and our friends at <a href="https://podman.io/">Podman</a> for their inspiration.</p> + + + + + + Docs: Requirements + /docs/installing-workflow/system-requirements/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/installing-workflow/system-requirements/ + + + + <h2 id="kubernetes-versions">Kubernetes Versions<a class="td-heading-self-link" href="#kubernetes-versions" aria-label="Heading self-link"></a></h2> +<p>Drycc Workflow requires Kubernetes v1.16.15 or later.</p> +<h2 id="components-requirements">Components Requirements<a class="td-heading-self-link" href="#components-requirements" aria-label="Heading self-link"></a></h2> +<p>Drycc uses gateway as a routing implementation, so you have to choose an gateway. We recommend using <a href="https://istio.io/">istio</a> or <a href="https://konghq.com/">kong</a>.</p> +<p>Workflow supports the use of ACME to manage automatic certificates, <a href="https://github.com/helm/charts/tree/master/stable/cert-manager">cert-manager</a> is also one of the necessary components, if you use cert-manager EAB, you need to set the <code>clusterResourceNamespace</code> to the namespace of drycc.</p> +<p>Workflow supports stateful apps. You can create and use them through the &lsquo;drycc volumes&rsquo; command. If you want to use this feature, you must have a <code>StorageClass</code> that supports <code>ReadWriteMany</code>.</p> +<p>Workflow also supports the <a href="https://github.com/openservicebrokerapi/servicebroker">OSB</a> API through the &lsquo;drycc resources&rsquo; command. If you want to use this function, you need to install <a href="https://service-catalog.drycc.cc">service-catalog</a>.</p> +<h2 id="storage-requirements">Storage Requirements<a class="td-heading-self-link" href="#storage-requirements" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>Drycc Workflow ships with drycc storage by default, which provides in-cluster.</p> +<p>Workflow supports Amazon Simple Storage Service (S3), Google Cloud Storage (GCS), OpenShift Swift, and Azure Blob +Storage. See <a href="/docs/installing-workflow/configuring-object-storage/">configuring object storage</a> for setup instructions.</p> +<h2 id="resource-requirements">Resource Requirements<a class="td-heading-self-link" href="#resource-requirements" aria-label="Heading self-link"></a></h2> +<p>When deploying Drycc Workflow, it&rsquo;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.</p> +<p>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:</p> +<ul> +<li>At least 4GB of RAM (more is better)</li> +<li>At least 40GB of hard disk space</li> +</ul> +<p>Note that these estimates are for Drycc Workflow and Kubernetes only. Be sure to leave enough spare capacity for your +application footprint as well.</p> +<p>Running smaller machines will likely result in increased system load and has been known to result in component failures +and instability.</p> + + + + + + Docs: Troubleshooting Workflow + /docs/troubleshooting/workflow/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/troubleshooting/workflow/ + + + + <h2 id="a-component-fails-to-start">A Component Fails to Start<a class="td-heading-self-link" href="#a-component-fails-to-start" aria-label="Heading self-link"></a></h2> +<p>For information on troubleshooting a failing component, see +<a href="/docs/troubleshooting/kubectl/">Troubleshooting with Kubectl</a>.</p> +<h2 id="an-application-fails-to-start">An Application Fails to Start<a class="td-heading-self-link" href="#an-application-fails-to-start" aria-label="Heading self-link"></a></h2> +<p>For information on troubleshooting application deployment issues, see +<a href="/docs/troubleshooting/applications/">Troubleshooting Applications</a>.</p> +<h2 id="permission-denied-publickey">Permission denied (publickey)<a class="td-heading-self-link" href="#permission-denied-publickey" aria-label="Heading self-link"></a></h2> +<p>The most common problem for this issue is the user forgetting to run <code>drycc keys:add</code> or add their +private key to their SSH agent. To do so, run <code>ssh-add ~/.ssh/id_rsa</code> and try running +<code>git push drycc master</code> again.</p> +<p>If you happen get a <code>Could not open a connection to your authentication agent</code> +error after trying to run <code>ssh-add</code> command above, you may need to load the SSH +agent environment variables issuing the <code>eval &quot;$(ssh-agent)&quot;</code> command before.</p> +<h2 id="other-issues">Other Issues<a class="td-heading-self-link" href="#other-issues" aria-label="Heading self-link"></a></h2> +<p>Running into something not detailed here? Please <a href="https://github.com/drycc/workflow/issues/new">open an issue</a> or hop into +<a href="http://slack.drycc.cc/">#community on Slack</a> for help!</p> + + + + + + Docs: Tuning Component Settings + /docs/managing-workflow/tuning-component-settings/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/tuning-component-settings/ + + + + <p>After you add the Drycc Chart Repository, you can customize the chart using +<code>helm inspect values drycc/workflow &gt; values.yaml</code> before using <code>helm install</code> to complete the +installation.</p> +<p>There are a few ways to customize the respective component:</p> +<ul> +<li> +<p>If the value is exposed in the <code>values.yaml</code> 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:</p> +<pre><code> $ 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 +</code></pre> +</li> +<li> +<p>If the value hasn&rsquo;t yet been exposed in the <code>values.yaml</code> file, one may edit the component deployment with the tuned setting. Here we edit the <code>drycc-controller</code> deployment:</p> +<pre><code> $ kubectl --namespace drycc edit deployment drycc-controller +</code></pre> +<p>Add/edit the setting via the appropriate environment variable and value under the <code>env</code> section and save. The updated deployment will recreate the component pod with the new/modified setting.</p> +</li> +<li> +<p>Lastly, one may also fetch and edit the chart as served by version control/the chart repository itself:</p> +<pre><code> $ helm fetch oci://registry.drycc.cc/charts/workflow --untar + $ $EDITOR workflow/charts/controller/templates/controller-deployment.yaml +</code></pre> +<p>Then run <code>helm install ./workflow --namespace drycc --name drycc</code> to apply the changes, or <code>helm upgrade drycc ./workflow</code> if the cluster is already running.</p> +</li> +</ul> +<h2 id="setting-resource-limits">Setting Resource limits<a class="td-heading-self-link" href="#setting-resource-limits" aria-label="Heading self-link"></a></h2> +<p>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 <code>limitsCpu</code>, <code>limitsMemory</code> in the section and set them to the appropriate +values.</p> +<p>Below is an example of how the builder section of <code>values.yaml</code> might look with CPU and memory +limits set:</p> +<pre tabindex="0"><code>builder: + imageOrg: &#34;drycc&#34; + imagePullPolicy: &#34;Always&#34; + imageTag: &#34;canary&#34; + limitsCpu: &#34;100m&#34; + limitsMemory: &#34;50Mi&#34; +</code></pre><h2 id="customizing-the-builder">Customizing the Builder<a class="td-heading-self-link" href="#customizing-the-builder" aria-label="Heading self-link"></a></h2> +<p>The following environment variables are tunable for the <a href="/docs/understanding-workflow/components/#builder">Builder</a> component:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>DEBUG</td> +<td>Enable debug log output (default: false)</td> +</tr> +<tr> +<td>BUILDER_POD_NODE_SELECTOR</td> +<td>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&rsquo;t affect critical nodes. for example <code>pool:testing,disk:magnetic</code></td> +</tr> +</tbody> +</table> +<h2 id="customizing-the-controller">Customizing the Controller<a class="td-heading-self-link" href="#customizing-the-controller" aria-label="Heading self-link"></a></h2> +<p>The following environment variables are tunable for the <a href="/docs/understanding-workflow/components/#controller">Controller</a> component:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>REGISTRATION_MODE</td> +<td>set registration to &ldquo;enabled&rdquo;, &ldquo;disabled&rdquo;, or &ldquo;admin_only&rdquo; (default: &ldquo;admin_only&rdquo;)</td> +</tr> +<tr> +<td>GUNICORN_WORKERS</td> +<td>number of <a href="http://gunicorn.org/">gunicorn</a> workers spawned to process requests (default: CPU cores * 4 + 1)</td> +</tr> +<tr> +<td>RESERVED_NAMES</td> +<td>a comma-separated list of names which applications cannot reserve for routing (default: &ldquo;drycc, drycc-builder&rdquo;)</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_HOOK_URLS</td> +<td>a comma-separated list of URLs to send <a href="/docs/managing-workflow/deploy-hooks/#http-post-hook">deploy hooks</a> to.</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_HOOK_SECRET_KEY</td> +<td>a private key used to compute the HMAC signature for deploy hooks.</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_REJECT_IF_PROCFILE_MISSING</td> +<td>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: &ldquo;false&rdquo;, allowed values: &ldquo;true&rdquo;, &ldquo;false&rdquo;)</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_PROCFILE_MISSING_REMOVE</td> +<td>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: &ldquo;true&rdquo;, allowed values: &ldquo;true&rdquo;, &ldquo;false&rdquo;)</td> +</tr> +<tr> +<td>DRYCC_DEFAULT_CONFIG_TAGS</td> +<td>set tags for all applications by default, for example: &lsquo;{&ldquo;role&rdquo;: &ldquo;worker&rdquo;}&rsquo;. (default: &lsquo;&rsquo;)</td> +</tr> +<tr> +<td>KUBERNETES_NAMESPACE_DEFAULT_QUOTA_SPEC</td> +<td>set resource quota to application namespace by setting <a href="http://kubernetes.io/docs/admin/resourcequota/">ResourceQuota</a> spec, for example: <code>{&quot;spec&quot;:{&quot;hard&quot;:{&quot;pods&quot;:&quot;10&quot;}}}</code>, restrict app owner to spawn more then 10 pods (default: &ldquo;&rdquo;, no quota will be applied to namespace)</td> +</tr> +</tbody> +</table> +<h3 id="ldap-authentication-settings">LDAP authentication settings<a class="td-heading-self-link" href="#ldap-authentication-settings" aria-label="Heading self-link"></a></h3> +<p>Configuration options for LDAP authentication are detailed <a href="https://pythonhosted.org/django-auth-ldap/reference.html">here</a>.</p> +<p>The following environment variables are available for enabling LDAP +authentication of user accounts in the <a href="/docs/understanding-workflow/components/#passport">Passport</a> component:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>LDAP_ENDPOINT</td> +<td>The URI of the LDAP server. If not specified, LDAP authentication is not enabled (default: &ldquo;&rdquo;, example: <code>ldap://hostname</code>).</td> +</tr> +<tr> +<td>LDAP_BIND_DN</td> +<td>The distinguished name to use when binding to the LDAP server (default: &ldquo;&rdquo;)</td> +</tr> +<tr> +<td>LDAP_BIND_PASSWORD</td> +<td>The password to use with LDAP_BIND_DN (default: &ldquo;&rdquo;)</td> +</tr> +<tr> +<td>LDAP_USER_BASEDN</td> +<td>The distinguished name of the search base for user names (default: &ldquo;&rdquo;)</td> +</tr> +<tr> +<td>LDAP_USER_FILTER</td> +<td>The name of the login field in the users search base (default: &ldquo;username&rdquo;)</td> +</tr> +<tr> +<td>LDAP_GROUP_BASEDN</td> +<td>The distinguished name of the search base for user&rsquo;s groups names (default: &ldquo;&rdquo;)</td> +</tr> +<tr> +<td>LDAP_GROUP_FILTER</td> +<td>The filter for user&rsquo;s groups (default: &ldquo;&rdquo;, example: <code>objectClass=person</code>)</td> +</tr> +</tbody> +</table> +<h3 id="global-and-per-application-settings">Global and per application settings<a class="td-heading-self-link" href="#global-and-per-application-settings" aria-label="Heading self-link"></a></h3> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>DRYCC_DEPLOY_BATCHES</td> +<td>the number of pods to bring up and take down sequentially during a scale (default: number of available nodes)</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_TIMEOUT</td> +<td>deploy timeout in seconds per deploy batch (default: 120)</td> +</tr> +<tr> +<td>IMAGE_PULL_POLICY</td> +<td>the kubernetes <a href="http://kubernetes.io/docs/user-guide/images/">image pull policy</a> for application images (default: &ldquo;IfNotPresent&rdquo;) (allowed values: &ldquo;Always&rdquo;, &ldquo;IfNotPresent&rdquo;)</td> +</tr> +<tr> +<td>KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT</td> +<td>how many <a href="http://kubernetes.io/docs/user-guide/deployments/#revision-history-limit">revisions</a> Kubernetes keeps around of a given Deployment (default: all revisions)</td> +</tr> +<tr> +<td>KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS</td> +<td>how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30)</td> +</tr> +</tbody> +</table> +<p>See the <a href="/docs/applications/deploying-apps/">Deploying Apps</a> guide for more detailed information on those.</p> +<h2 id="customizing-the-database">Customizing the Database<a class="td-heading-self-link" href="#customizing-the-database" aria-label="Heading self-link"></a></h2> +<p>The following environment variables are tunable for the <a href="/docs/understanding-workflow/components/#database">Database</a> component:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>BACKUP_FREQUENCY</td> +<td>how often the database should perform a base backup (default: &ldquo;12h&rdquo;)</td> +</tr> +<tr> +<td>BACKUPS_TO_RETAIN</td> +<td>number of base backups the backing store should retain (default: 5)</td> +</tr> +</tbody> +</table> +<h2 id="customizing-fluentbit">Customizing Fluentbit<a class="td-heading-self-link" href="#customizing-fluentbit" aria-label="Heading self-link"></a></h2> +<p>The following values can be changed in the <code>values.yaml</code> file or by using the <code>--values</code> flag with the Helm CLI.</p> +<table> +<thead> +<tr> +<th>Key</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>config.service</td> +<td>The service section defines the global properties of the service.</td> +</tr> +<tr> +<td>config.inputs</td> +<td>An input section defines a source (related to an input plugin).</td> +</tr> +<tr> +<td>config.filters</td> +<td>A filter section defines a filter (related to a filter plugin)</td> +</tr> +<tr> +<td>config.outputs</td> +<td>The outputs section specify a destination that certain records should follow after a Tag match.</td> +</tr> +</tbody> +</table> +<p>For more information about the various variables that can be set please see the <a href="https://github.com/drycc/fluentbit">fluentbit</a>.</p> +<h2 id="customizing-the-logger">Customizing the Logger<a class="td-heading-self-link" href="#customizing-the-logger" aria-label="Heading self-link"></a></h2> +<p>The following environment variables are tunable for the <a href="/docs/understanding-workflow/components/#logger-fluentbit-logger">Logger</a> component:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>STORAGE_ADAPTER</td> +<td>How to store logs that are sent to the logger. Legal values are &ldquo;file&rdquo;, &ldquo;memory&rdquo;, and &ldquo;redis&rdquo;. (default: &ldquo;redis&rdquo;)</td> +</tr> +<tr> +<td>NUMBER_OF_LINES</td> +<td>How many lines to store in the ring buffer (default: 1000)</td> +</tr> +</tbody> +</table> +<h2 id="customizing-the-monitor">Customizing the Monitor<a class="td-heading-self-link" href="#customizing-the-monitor" aria-label="Heading self-link"></a></h2> +<h3 id="grafanahttpsgrafanacom"><a href="https://grafana.com/">Grafana</a><a class="td-heading-self-link" href="#grafanahttpsgrafanacom" aria-label="Heading self-link"></a></h3> +<p>We have exposed some of the more useful configuration values directly in the chart. This allows them to be set using either the <code>values.yaml</code> file or by using the <code>--set</code> flag with the Helm CLI. You can see these options below:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Default Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>user</td> +<td>&ldquo;admin&rdquo;</td> +<td>The first user created in the database (this user has admin privileges)</td> +</tr> +<tr> +<td>password</td> +<td>&ldquo;admin&rdquo;</td> +<td>Password for the first user.</td> +</tr> +<tr> +<td>allow_sign_up</td> +<td>&ldquo;true&rdquo;</td> +<td>Allows users to sign up for an account.</td> +</tr> +</tbody> +</table> +<p>For a list of other options you can set by using environment variables please see the <a href="https://github.com/drycc/monitor/blob/main/grafana/rootfs/usr/share/grafana/grafana.ini.tpl">configuration file</a> in Github.</p> +<h3 id="telegrafhttpsdocsinfluxdatacomtelegraf"><a href="https://docs.influxdata.com/telegraf">Telegraf</a><a class="td-heading-self-link" href="#telegrafhttpsdocsinfluxdatacomtelegraf" aria-label="Heading self-link"></a></h3> +<p>For a list of configuration values that can be set by using environment variables please see the following <a href="https://github.com/drycc/monitor/blob/main/telegraf/rootfs/config.toml.tpl">configuration file</a>.</p> +<h3 id="prometheushttpsprometheusio"><a href="https://prometheus.io">Prometheus</a><a class="td-heading-self-link" href="#prometheushttpsprometheusio" aria-label="Heading self-link"></a></h3> +<p>You can find a list of values that can be set using environment variables <a href="https://github.com/drycc/prometheus">here</a>.</p> +<h2 id="customizing-the-registry">Customizing the Registry<a class="td-heading-self-link" href="#customizing-the-registry" aria-label="Heading self-link"></a></h2> +<p>The <a href="/docs/understanding-workflow/components/#registry">Registry</a> component can be tuned by following the +<a href="https://github.com/drycc/distribution/blob/main/docs/configuration.md">drycc/distribution config doc</a>.</p> +<h2 id="customizing-the-router">Customizing the Router<a class="td-heading-self-link" href="#customizing-the-router" aria-label="Heading self-link"></a></h2> +<p>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 +<a href="https://github.com/drycc/router#annotations">here</a>.</p> +<p>The following environment variables are tunable for the [Router][] component:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>POD_NAMESPACE</td> +<td>The pod namespace the router resides in. This is set by the <a href="http://kubernetes.io/docs/user-guide/downward-api/">Kubernetes downward API</a>.</td> +</tr> +</tbody> +</table> +<h2 id="customizing-workflow-manager">Customizing Workflow Manager<a class="td-heading-self-link" href="#customizing-workflow-manager" aria-label="Heading self-link"></a></h2> +<p>The following environment variables are tunable for [Workflow Manager][]:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>CHECK_VERSIONS</td> +<td>Enables the external version check at <a href="https://versions.drycc.info/">https://versions.drycc.info/</a> (default: &ldquo;true&rdquo;)</td> +</tr> +<tr> +<td>POLL_INTERVAL_SEC</td> +<td>The interval when Workflow Manager performs a version check, in seconds (default: 43200, or 12 hours)</td> +</tr> +<tr> +<td>VERSIONS_API_URL</td> +<td>The versions API URL (default: &ldquo;<a href="https://versions-staging.drycc.info">https://versions-staging.drycc.info</a>&rdquo;)</td> +</tr> +<tr> +<td>DOCTOR_API_URL</td> +<td>The doctor API URL (default: &ldquo;<a href="https://doctor-staging.drycc.info">https://doctor-staging.drycc.info</a>&rdquo;)</td> +</tr> +<tr> +<td>API_VERSION</td> +<td>The version number Workflow Manager sends to the versions API (default: &ldquo;v2&rdquo;)</td> +</tr> +</tbody> +</table> + + + + + + Docs: Architecture + /docs/understanding-workflow/architecture/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/understanding-workflow/architecture/ + + + + <p>All components are published as a set of container images which can be deployed to any +compliant Kubernetes cluster.</p> +<h2 id="overview">Overview<a class="td-heading-self-link" href="#overview" aria-label="Heading self-link"></a></h2> +<p><img alt="System Overview" src="../../diagrams/Ecosystem_Basic.jpg"></p> +<p>Operators use <a href="https://github.com/kubernetes/helm">Helm</a> 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.</p> +<h2 id="platform-services">Platform Services<a class="td-heading-self-link" href="#platform-services" aria-label="Heading self-link"></a></h2> +<p><img alt="Workflow Overview" src="../../diagrams/Workflow_Overview.jpg"></p> +<p>Drycc Workflow provides additional functionality to your Kubernetes cluster, including:</p> +<ul> +<li><a href="/docs/understanding-workflow/components/#builder">Source to Image Builder</a> which compiles your Application code via Buildpacks or Dockerfiles</li> +<li><a href="/docs/understanding-workflow/components/#logger">Cross-Pod Log Aggregation</a> which gathers logs from all of your Application processes</li> +<li><a href="/docs/understanding-workflow/components/#controller">Simple REST API</a> which powers the CLI and any external integrations</li> +<li>Application release and rollback</li> +<li>Authentication and Authorization to Application resources</li> +<li><a href="/docs/understanding-workflow/components/#router">HTTP/HTTPS edge routing</a> for your Applications</li> +</ul> +<h2 id="kubernetes-native">Kubernetes-Native<a class="td-heading-self-link" href="#kubernetes-native" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p><img alt="Workflow and Kubernetes" src="../../diagrams/Workflow_Detail.png"></p> +<h2 id="application-layout-and-edge-routing">Application Layout and Edge Routing<a class="td-heading-self-link" href="#application-layout-and-edge-routing" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p><img alt="Application Configuration" src="../../diagrams/Application_Layout.png"></p> +<p>The router component is responsible for routing HTTP/s traffic to your +Applications as well as proxying <code>git push</code> and platform API traffic.</p> +<p>By default, the router component is deployed as a Kubernetes service with type +<code>LoadBalancer</code>; which, depending on your configuration, will provision a +cloud-native load balancer automatically.</p> +<p>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.</p> +<h2 id="topologies">Topologies<a class="td-heading-self-link" href="#topologies" aria-label="Heading self-link"></a></h2> +<p>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.</p> + + + + + + Docs: Using Buildpacks + /docs/applications/using-buildpacks/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/using-buildpacks/ + + + + <p>Drycc supports deploying applications via <a href="https://buildpacks.io/">Cloud Native Buildpacks</a>. Cloud Native Buildpacks are useful if you want to follow <a href="https://buildpacks.io/docs/">cnb&rsquo;s docs</a> for building applications.</p> +<h2 id="add-ssh-key">Add SSH Key<a class="td-heading-self-link" href="#add-ssh-key" aria-label="Heading self-link"></a></h2> +<p>For <strong>Buildpack</strong> based application deploys via <code>git push</code>, Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user.</p> +<ul> +<li> +<p>See <a href="/docs/users/ssh-keys/#generate-an-ssh-key">this document</a> for instructions on how to generate an SSH key.</p> +</li> +<li> +<p>Run <code>drycc keys:add</code> to upload your SSH key to Drycc Workflow.</p> +</li> +</ul> +<pre tabindex="0"><code>$ drycc keys:add ~/.ssh/id_drycc.pub +Uploading id_drycc.pub to drycc... done +</code></pre><p>Read more about adding/removing SSH Keys <a href="/docs/users/ssh-keys/#adding-and-removing-ssh-keys">here</a>.</p> +<h2 id="prepare-an-application">Prepare an Application<a class="td-heading-self-link" href="#prepare-an-application" aria-label="Heading self-link"></a></h2> +<p>If you do not have an existing application, you can clone an example application that demonstrates the Heroku Buildpack workflow.</p> +<pre><code>$ git clone https://github.com/drycc/example-go.git +$ cd example-go +</code></pre> +<h2 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h2> +<p>Use <code>drycc create</code> to create an application on the <a href="/docs/understanding-workflow/components/#controller">Controller</a>.</p> +<pre><code>$ drycc create +Creating application... done, created skiing-keypunch +Git remote drycc added +</code></pre> +<h2 id="push-to-deploy">Push to Deploy<a class="td-heading-self-link" href="#push-to-deploy" aria-label="Heading self-link"></a></h2> +<p>Use <code>git push drycc master</code> to deploy your application.</p> +<pre><code>$ 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: ---&gt; +Starting build... but first, coffee! +---&gt; Waiting podman running. +---&gt; Process podman started. +---&gt; Waiting caddy running. +---&gt; Process caddy started. +---&gt; Building pack +---&gt; 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 &quot;drycc/buildpacks&quot; using unqualified-search registries (/etc/containers/registries.conf) +Trying to pull registry.drycc.cc/drycc/buildpacks:bookworm... +Getting image source signatures +... +---&gt; Skip generate base layer +---&gt; Python Buildpack +---&gt; Downloading and extracting Python 3.10.0 +---&gt; 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&gt;=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&lt;4,&gt;=3.3.2 +Downloading asgiref-3.4.1-py3-none-any.whl (25 kB) +Requirement already satisfied: setuptools&gt;=3.0 in /layers/drycc_python/python/lib/python3.10/site-packages (from gunicorn==20.1.0-&gt;-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 +---&gt; 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 -&gt; master + +$ curl -s http://skiing-keypunch.example.com +Powered by Drycc +Release v2 on skiing-keypunch-v2-web-02zb9 +</code></pre> +<p>Because a Buildpacks-style application is detected, the <code>web</code> process type is automatically scaled to 1 on first deploy.</p> +<p>Use <code>drycc scale web=3</code> to increase <code>web</code> processes to 3, for example. Scaling a +process type directly changes the number of <a href="http://kubernetes.io/v1.1/docs/user-guide/pods.html">pods</a> running that process.</p> +<h2 id="included-buildpacks">Included Buildpacks<a class="td-heading-self-link" href="#included-buildpacks" aria-label="Heading self-link"></a></h2> +<p>For convenience, a number of buildpacks come bundled with Drycc:</p> +<ul> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/go">Go Buildpack</a></li> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/java">Java Buildpack</a></li> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/nodejs">Nodejs Buildpack</a></li> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/php">PHP Buildpack</a></li> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/python">Python Buildpack</a></li> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/ruby">Ruby Buildpack</a></li> +<li><a href="https://github.com/drycc/pack-images/tree/main/buildpacks/rust">Rust Buildpack</a></li> +</ul> +<p>Drycc will cycle through the <code>bin/detect</code> script of each buildpack to match the code you +are pushing.</p> +<p>!!! note +If you&rsquo;re testing against the [Scala Buildpack][], the <a href="/docs/understanding-workflow/components/#builder">Builder</a> requires at least +512MB of free memory to execute the Scala Build Tool.</p> +<h2 id="using-a-custom-buildpack">Using a Custom Buildpack<a class="td-heading-self-link" href="#using-a-custom-buildpack" aria-label="Heading self-link"></a></h2> +<p>To use a custom buildpack, you need create a <code>.pack_builder</code> file in your root path app.</p> +<pre><code>$ tee &gt; .pack_builder &lt;&lt; EOF + &gt; registry.drycc.cc/drycc/buildpacks:bookworm + &gt; EOF +</code></pre> +<p>On your next <code>git push</code>, the custom buildpack will be used.</p> +<h2 id="using-private-repositories">Using Private Repositories<a class="td-heading-self-link" href="#using-private-repositories" aria-label="Heading self-link"></a></h2> +<p>To pull code from private repositories, set the <code>SSH_KEY</code> environment variable to a private key +which has access. Use either the path of a private key file or the raw key material:</p> +<pre><code>$ drycc config:set SSH_KEY=/home/user/.ssh/id_rsa +$ drycc config:set SSH_KEY=&quot;&quot;&quot;-----BEGIN RSA PRIVATE KEY----- +(...) +-----END RSA PRIVATE KEY-----&quot;&quot;&quot; +</code></pre> +<p>For example, to use a custom buildpack hosted at a private GitHub URL, ensure that an SSH public +key exists in your <a href="https://github.com/settings/ssh">GitHub settings</a>. Then set <code>SSH_KEY</code> to the corresponding SSH private key +and set <code>.pack_builder</code> to the builder image:</p> +<pre><code>$ tee &gt; .pack_builder &lt;&lt; EOF + &gt; registry.drycc.cc/drycc/buildpacks:bookworm + &gt; EOF +$ git add .buildpack +$ git commit -m &quot;chore(buildpack): modify the pack_builder&quot; +$ git push drycc master +</code></pre> +<h2 id="builder-selector">Builder selector<a class="td-heading-self-link" href="#builder-selector" aria-label="Heading self-link"></a></h2> +<p>Which way to build a project conforms to the following principles:</p> +<ul> +<li>If Dockerfile exists in the project, the stack uses <code>container</code></li> +<li>If Procfile exists in the project, the stack uses <code>buildpack</code></li> +<li>If both exist, <code>container</code> is used by default</li> +<li>You can also set the <code>DRYCC_STACK</code> to <code>container</code> or <code>buildpack</code> determine which stack to use.</li> +</ul> + + + + + + Docs: Configure DNS + /docs/managing-workflow/configuring-dns/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/configuring-dns/ + + + + <p>For example, assuming <code>example.com</code> were a cluster&rsquo;s domain:</p> +<ul> +<li>The controller should be accessible at <code>drycc.example.com</code></li> +<li>Applications should be accessible (by default) at <code>&lt;application name&gt;.example.com</code></li> +</ul> +<p>Given that this is the case, the primary objective in configuring DNS is that traffic for all subdomains of a cluster&rsquo;s domain be directed to the cluster node(s) hosting the platform&rsquo;s router component, which is capable of directing traffic within the cluster to the correct endpoints.</p> +<h2 id="with-a-load-balancer">With a Load Balancer<a class="td-heading-self-link" href="#with-a-load-balancer" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>For example, assuming a domain of <code>example.com</code>:</p> +<ul> +<li>An <code>A</code> record enumerating each of your load balancer(s) IPs (i.e. DNS round-robining)</li> +<li>A <code>CNAME</code> record referencing an existing fully-qualified domain name for the load balancer +<ul> +<li>Per <a href="https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/using-domain-names-with-elb.html">AWS&rsquo; own documentation</a>, this is the recommended strategy when using AWS Elastic Load Balancers, as ELB IPs may change over time.</li> +</ul> +</li> +</ul> +<p>DNS for any applications using a &ldquo;custom domain&rdquo; (a fully-qualified domain name that is not a subdomain of the cluster&rsquo;s own domain) can be configured by creating a <code>CNAME</code> record that references the wildcard record described above.</p> +<p>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 <code>kubectl</code> tool:</p> +<pre tabindex="0"><code>$ kubectl --namespace=istio-nginx describe service | grep &#34;LoadBalancer&#34; +LoadBalancer Ingress: a493e4e58ea0511e5bb390686bc85da3-1558404688.us-west-2.elb.amazonaws.com +</code></pre><p>The <code>LoadBalancer Ingress</code> 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.</p> +<h2 id="without-a-load-balancer">Without a Load Balancer<a class="td-heading-self-link" href="#without-a-load-balancer" aria-label="Heading self-link"></a></h2> +<p>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 <code>/etc/hosts</code> file.</p> +<p>Because wildcard entries do not work in a local <code>/etc/hosts</code> 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 <a href="http://xip.io/">xip.io</a> service.</p> +<p>In general, for any IP, <code>a.b.c.d</code>, the fully-qualified domain name <code>any-subdomain.a.b.c.d.xip.io</code> will resolve to the IP <code>a.b.c.d</code>. This can be enormously useful.</p> +<p>To begin, find the node(s) hosting router instances using <code>kubectl</code>:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>The command will display information for every router pod. For each, a node name and IP are displayed in the <code>Node</code> field. If the IPs appearing in these fields are public, any of these may be used to configure your local <code>/etc/hosts</code> file or may be used with <a href="http://xip.io/">xip.io</a>. If the IPs shown are not public, further investigation may be needed.</p> +<p>You can list the IP addresses of a node using <code>kubectl</code>:</p> +<pre tabindex="0"><code>$ 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 +# ... +</code></pre><p>Here, the <code>Addresses</code> field lists all the node&rsquo;s IPs. If any of them are public, again, they may be used to configure your local <code>/etc/hosts</code> file or may be used with <a href="http://xip.io/">xip.io</a>.</p> +<h2 id="tutorial-configuring-dns-with-google-cloud-dnscloud-dns">Tutorial: Configuring DNS with <a href="https://cloud.google.com/dns/docs">Google Cloud DNS</a><a class="td-heading-self-link" href="#tutorial-configuring-dns-with-google-cloud-dnscloud-dns" aria-label="Heading self-link"></a></h2> +<p>In this section, we&rsquo;ll describe how to configure Google Cloud DNS for routing your domain name to your Drycc cluster.</p> +<p>We&rsquo;ll assume the following in this section:</p> +<ul> +<li>Your Ingress service has a load balancer in front of it. +<ul> +<li>The load balancer need not be cloud based, it just needs to provide a stable IP address or a stable domain name</li> +</ul> +</li> +<li>You have the <code>mystuff.com</code> domain name registered with a registrar +<ul> +<li>Replace your domain name with <code>mystuff.com</code> in the instructions to follow</li> +</ul> +</li> +<li>Your registrar lets you alter the nameservers for your domain name (most registrars do)</li> +</ul> +<p>Here are the steps for configuring cloud DNS to route to your drycc cluster:</p> +<ol> +<li>Get the load balancer IP or domain name</li> +</ol> +<ul> +<li>If you are on Google Container Engine, you can run <code>kubectl get svc -n istio-ingress</code> and look for the <code>LoadBalancer Ingress</code> column to get the IP address</li> +</ul> +<ol start="2"> +<li>Create a new Cloud DNS Zone (on the console: <code>Networking</code> =&gt; <code>Cloud DNS</code>, then click on <code>Create Zone</code>)</li> +<li>Name your zone, and set the DNS name to <code>mystuff.com.</code> (note the <code>.</code> at the end</li> +<li>Click on the <code>Create</code> button</li> +<li>Click on the <code>Add Record Set</code> button on the resulting page</li> +<li>If your load balancer provides a stable IP address, enter the following fields in the resulting form:</li> +<li><code>DNS Name</code>: <code>*</code></li> +<li><code>Resource Record Type</code>: <code>A</code></li> +<li><code>TTL</code>: the DNS TTL of your choosing. If you&rsquo;re testing or you anticipate that you&rsquo;ll tear down and rebuild many drycc clusters over time, we recommend a low TTL</li> +<li><code>IPv4 Address</code>: The IP that you got in the very first step</li> +<li>Click the <code>Create</code> button</li> +<li>If your load balancer provides the stable domain name <code>lbdomain.com</code>, enter the following fields in the resulting form:</li> +<li><code>DNS Name</code>: <code>*</code></li> +<li><code>Resource Record Type</code>: <code>CNAME</code></li> +<li><code>TTL</code>: the DNS TTL of your choosing. If you&rsquo;re testing or you anticipate that you&rsquo;ll tear down and rebuild many drycc clusters over time, we recommend a low TTL</li> +<li><code>Canonical name</code>: <code>lbdomain.com.</code> (note the <code>.</code> a the end)</li> +<li>Click on the <code>Create</code> button</li> +<li>In your domain registrar, set the nameservers for your <code>mystuff.com</code> domain to the ones under the <code>data</code> column in the <code>NS</code> record on the same page. They&rsquo;ll often be something like the below (note the trailing <code>.</code> characters).</li> +</ol> +<pre tabindex="0"><code>ns-cloud-b1.googledomains.com. +ns-cloud-b2.googledomains.com. +ns-cloud-b3.googledomains.com. +ns-cloud-b4.googledomains.com. +</code></pre><p>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.</p> +<h2 id="testing">Testing<a class="td-heading-self-link" href="#testing" aria-label="Heading self-link"></a></h2> +<p>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!):</p> +<pre tabindex="0"><code>curl http://drycc.example.com/v2/ +</code></pre><p>Or:</p> +<pre tabindex="0"><code>curl http://drycc.54.218.85.175.xip.io/v2/ +</code></pre><p>Since such requests require authentication, a response such as the following should be considered an indicator of success:</p> +<pre tabindex="0"><code>{&#34;detail&#34;:&#34;Authentication credentials were not provided.&#34;} +</code></pre> + + + + + Docs: Design Documents + /docs/contribution-guidelines/design-documents/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/design-documents/ + + + + <p>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.</p> +<h2 id="goals">Goals<a class="td-heading-self-link" href="#goals" aria-label="Heading self-link"></a></h2> +<p>Design documents help ensure project contributors:</p> +<ul> +<li>Involve stakeholders as early as possible in a feature&rsquo;s development</li> +<li>Ensure code changes accomplish the original motivations and design goals</li> +<li>Establish clear acceptance criteria for a feature or change</li> +<li>Enforce test-driven design methodology and automated test coverage</li> +</ul> +<h2 id="contents">Contents<a class="td-heading-self-link" href="#contents" aria-label="Heading self-link"></a></h2> +<p>Design document issues should be named <code>Design Doc: &lt;change description&gt;</code> and contain the following sections:</p> +<h3 id="goal">Goal<a class="td-heading-self-link" href="#goal" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p>This section should also reference a separate GitHub issue tracking the feature or change, which will typically be assigned to a release milestone.</p> +<h3 id="code-changes">Code Changes<a class="td-heading-self-link" href="#code-changes" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<h3 id="tests">Tests<a class="td-heading-self-link" href="#tests" aria-label="Heading self-link"></a></h3> +<p>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&rsquo;t introduce any regressions.</p> +<p>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.</p> +<p>The tests described here also form the acceptance criteria for the change, so that when it&rsquo;s completed maintainers can merge the pull request after confirming the tests pass CI.</p> +<h3 id="approval">Approval<a class="td-heading-self-link" href="#approval" aria-label="Heading self-link"></a></h3> +<p>A design document follows the same <a href="/docs/contribution-guidelines/submitting-a-pull-request/#merge-approval">merge approval</a> 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.</p> +<p>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.</p> +<p>See <a href="/docs/contribution-guidelines/submitting-a-pull-request/">Submitting a Pull Request</a> for more information on pull request and commit message formatting.</p> + + + + + + Docs: Install Workflow + /docs/quickstart/install-workflow/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/quickstart/install-workflow/ + + + + <p>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.</p> +<h2 id="operating-systems">Operating Systems<a class="td-heading-self-link" href="#operating-systems" aria-label="Heading self-link"></a></h2> +<p>Drycc is expected to work on most modern Linux systems. Some OSS have specific requirements:</p> +<ul> +<li>(Red Hat/CentOS) Enterprise Linux, they usually use RPM package management.</li> +<li>Ubuntu (Desktop/Server/Cloud) Linux, a very popular distribution.</li> +<li>Debian GNU Linux, a very pure distribution of opensource software.</li> +</ul> +<p>If you want to add more Linux distribution support, please submit a issue on github or submit PR directly.</p> +<h2 id="system-software">System Software<a class="td-heading-self-link" href="#system-software" aria-label="Heading self-link"></a></h2> +<p>Some basic software needs to be installed before installing drycc workflow.</p> +<h3 id="os-configuration">OS configuration<a class="td-heading-self-link" href="#os-configuration" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<h3 id="installing-nfsv4-client">Installing NFSv4 client<a class="td-heading-self-link" href="#installing-nfsv4-client" aria-label="Heading self-link"></a></h3> +<p>The command used to install a NFSv4 client differs depending on the Linux distribution.</p> +<p>For Debian and Ubuntu, use this command:</p> +<pre tabindex="0"><code>$ apt-get install nfs-common +</code></pre><p>For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:</p> +<pre tabindex="0"><code>$ yum install nfs-utils +</code></pre><h3 id="installing-curl">Installing curl<a class="td-heading-self-link" href="#installing-curl" aria-label="Heading self-link"></a></h3> +<p>For Debian and Ubuntu, use this command:</p> +<pre tabindex="0"><code>$ apt-get install curl +</code></pre><p>For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:</p> +<pre tabindex="0"><code>$ yum install curl +</code></pre><h2 id="hardware">Hardware<a class="td-heading-self-link" href="#hardware" aria-label="Heading self-link"></a></h2> +<p>Hardware requirements scale based on the size of your deployments. Minimum recommendations are outlined here.</p> +<ul> +<li>RAM: 1G Minimum (we recommend at least 2GB)</li> +<li>CPU: 1 Minimum</li> +</ul> +<p>This configuration only contains the minimum requirements that can meet the operation.</p> +<h2 id="disk">Disk<a class="td-heading-self-link" href="#disk" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<h2 id="domain-name">Domain Name<a class="td-heading-self-link" href="#domain-name" aria-label="Heading self-link"></a></h2> +<p>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 <code>*.dryccdoman.com</code>. +We need to set the <code>PLATFORM_DOMAIN</code> environment variables before installation.</p> +<pre tabindex="0"><code>$ export PLATFORM_DOMAIN=dryccdoman.co +</code></pre><p>Of course, if it is a test environment, we can also use <code>nip.io</code>, an IP to domain name service. +For example, your host IP is <code>59.46.3.190</code>, we will get the following domain name <code>59.46.3.190.nip.io</code></p> +<pre tabindex="0"><code>$ export PLATFORM_DOMAIN=59.46.3.190.nip.io +</code></pre><h2 id="install">Install<a class="td-heading-self-link" href="#install" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<pre tabindex="0"><code>$ export CERT_MANAGER_ENABLED=false +</code></pre><p>Then you can use the installation script available at <a href="https://www.drycc.cc/install.sh">https://www.drycc.cc/install.sh</a> to install drycc as a service on systemd and openrc based systems.</p> +<pre tabindex="0"><code>$ curl -sfL https://www.drycc.cc/install.sh | bash - +</code></pre><p>!!! important +If you are in China, you need to use mirror acceleration:</p> +<pre><code>``` +$ curl -sfL https://www.drycc.cc/install.sh | INSTALL_DRYCC_MIRROR=cn bash - +``` +</code></pre> +<h3 id="install-node">Install Node<a class="td-heading-self-link" href="#install-node" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<ul> +<li>First, check the cluster token of the master.</li> +</ul> +<pre tabindex="0"><code>$ cat /var/lib/rancher/k3s/server/node-token +K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa +</code></pre><p>We assume that the IP address of the cluster master is <code>192.168.6.240</code>, in that way.</p> +<ul> +<li>Then, Set the environment variable:</li> +</ul> +<pre tabindex="0"><code>$ export K3S_URL=https://192.168.6.240:6443 +$ export K3S_TOKEN=&#34;K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa&#34; +</code></pre><p>!!! important +If you are in China, you need to use mirror acceleration:</p> +<pre><code>``` +$ export INSTALL_DRYCC_MIRROR=cn +``` +</code></pre> +<ul> +<li>Join the cluster as server:</li> +</ul> +<pre tabindex="0"><code>$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_server +</code></pre><ul> +<li>Join the cluster as agent:</li> +</ul> +<pre tabindex="0"><code>$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_agent +</code></pre><h3 id="install-options">Install Options<a class="td-heading-self-link" href="#install-options" aria-label="Heading self-link"></a></h3> +<p>When using this method to install drycc, the following environment variables can be used to configure the installation:</p> +<table> +<thead> +<tr> +<th>ENVIRONMENT VARIABLE</th> +<th>DESCRIPTION</th> +</tr> +</thead> +<tbody> +<tr> +<td>PLATFORM_DOMAIN</td> +<td>Required item, specify drycc&rsquo;s domain name</td> +</tr> +<tr> +<td>DRYCC_ADMIN_USERNAME</td> +<td>Required item, specify drycc&rsquo;s admin username</td> +</tr> +<tr> +<td>DRYCC_ADMIN_PASSWORD</td> +<td>Required item, specify drycc&rsquo;s admin password</td> +</tr> +<tr> +<td>CERT_MANAGER_ENABLED</td> +<td>Whether to use automatic certificate. It is <code>false</code> by default</td> +</tr> +<tr> +<td>CHANNEL</td> +<td>By default, <code>stable</code> channel will be installed. You can also specify <code>testing</code></td> +</tr> +<tr> +<td>REGISTRY_FILE</td> +<td>The <code>config.yaml</code> file path used by k3s containers registry</td> +</tr> +<tr> +<td>KUBERNETES_SERVICE_HOST</td> +<td>Set with the HOST of the loadbalancer that was in front of kube-apiserver</td> +</tr> +<tr> +<td>KUBERNETES_SERVICE_PORT</td> +<td>Set with the PORT of the loadbalancer that was in front of kube-apiserver</td> +</tr> +<tr> +<td>METALLB_CONFIG_FILE</td> +<td>The metallb config file path, layer 2 network is used by default</td> +</tr> +<tr> +<td>INSTALL_DRYCC_MIRROR</td> +<td>Specify the accelerated mirror location. Currently, only <code>cn</code> is supported</td> +</tr> +<tr> +<td>BUILDER_REPLICAS</td> +<td>Number of builder replicas to deploy</td> +</tr> +<tr> +<td>CONTROLLER_API_REPLICAS</td> +<td>Number of controller api replicas to deploy</td> +</tr> +<tr> +<td>CONTROLLER_CELERY_REPLICAS</td> +<td>Number of controller celery replicas to deploy</td> +</tr> +<tr> +<td>CONTROLLER_WEBHOOK_REPLICAS</td> +<td>Number of controller webhook replicas to deploy</td> +</tr> +<tr> +<td>CONTROLLER_APP_RUNTIME_CLASS</td> +<td>RuntimeClass is a feature for selecting the container runtime configuration.</td> +</tr> +<tr> +<td>CONTROLLER_APP_STORAGE_CLASS</td> +<td>StorageClass allocated by <code>drycc volumes</code>; default storageClass is used by default</td> +</tr> +<tr> +<td>REDIS_REPLICAS</td> +<td>Number of redis replicas to deploy</td> +</tr> +<tr> +<td>REDIS_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>redis</code>, which is <code>5Gi</code> by default</td> +</tr> +<tr> +<td>REDIS_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>redis</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>STORAGE_CSI_STATEFULSET_REPLICAS</td> +<td>Number of storage csi controller replicas to deploy</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_TIPD_REPLICAS</td> +<td>Number of storage mainode tipd replicas to deploy</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_TIPD_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>mainnode tipd</code>, which is <code>10Gi</code> by default</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_TIPD_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>mainnode tipd</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_WEED_REPLICAS</td> +<td>Number of storage mainode weed replicas to deploy</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_WEED_PREALLOCATE</td> +<td>Preallocate disk space for volumes, <code>false</code> is used by default</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_WEED_SIZE_LIMIT_MB</td> +<td>Master stops directing writes to oversized volumes, <code>30000</code> is used by default</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_WEED_DEFAULT_REPLICATION</td> +<td>default replication type if not specified, which is <code>000</code> by default</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_WEED_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>mainnode weed</code>, which is <code>10Gi</code> by default</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_WEED_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>mainnode weed</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>STORAGE_METANODE_TIKV_REPLICAS</td> +<td>Number of storage metanode tikv replicas to deploy</td> +</tr> +<tr> +<td>STORAGE_METANODE_TIKV_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>metanode tikv</code>, which is <code>10Gi</code> by default</td> +</tr> +<tr> +<td>STORAGE_METANODE_TIKV_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>mainnode tikv</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>STORAGE_METANODE_WEED_REPLICAS</td> +<td>Number of storage metanode weed replicas to deploy</td> +</tr> +<tr> +<td>STORAGE_METANODE_WEED_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>metanode weed</code>, which is <code>10Gi</code> by default</td> +</tr> +<tr> +<td>STORAGE_METANODE_WEED_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>mainnode weed</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>STORAGE_DATANODE_WEED_REPLICAS</td> +<td>Number of storage datanode weed replicas to deploy</td> +</tr> +<tr> +<td>STORAGE_DATANODE_WEED_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>datanode weed</code>, which is <code>20Gi</code> by default</td> +</tr> +<tr> +<td>STORAGE_DATANODE_WEED_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>datanode weed</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>MONITOR_GRAFANA_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>monitor.grafana</code>, which is <code>5Gi</code> by default</td> +</tr> +<tr> +<td>MONITOR_GRAFANA_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>monitor</code> grafana; default storangeclass is used by default</td> +</tr> +<tr> +<td>LOGGER_REPLICAS</td> +<td>Number of logger replicas to deploy</td> +</tr> +<tr> +<td>RABBITMQ_REPLICAS</td> +<td>Number of rabbitmq replicas to deploy</td> +</tr> +<tr> +<td>RABBITMQ_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>rabbitmq</code>, which is <code>5Gi</code> by default</td> +</tr> +<tr> +<td>RABBITMQ_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>rabbitmq</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>DATABASE_REPLICAS</td> +<td>Number of database replicas to deploy</td> +</tr> +<tr> +<td>DATABASE_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>database</code>, which is <code>5Gi</code> by default</td> +</tr> +<tr> +<td>DATABASE_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>database</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>TIMESERIES_REPLICAS</td> +<td>Number of timeseries replicas to deploy</td> +</tr> +<tr> +<td>TIMESERIES_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>timeseries</code>, which is <code>5Gi</code> by default</td> +</tr> +<tr> +<td>TIMESERIES_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>timeseries</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>PASSPORT_REPLICAS</td> +<td>Number of passport replicas to deploy</td> +</tr> +<tr> +<td>REGISTRY_REPLICAS</td> +<td>Number of registry replicas to deploy</td> +</tr> +<tr> +<td>HELMBROKER_REPLICAS</td> +<td>Number of helmbroker api replicas to deploy</td> +</tr> +<tr> +<td>HELMBROKER_CELERY_REPLICAS</td> +<td>Number of helmbroker celery replicas to deploy</td> +</tr> +<tr> +<td>HELMBROKER_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>helmbroker</code>, which is <code>5Gi</code> by default</td> +</tr> +<tr> +<td>HELMBROKER_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>helmbroker</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>PROMETHEUS_SERVER_RETENTION</td> +<td>Prometheus data retention period (default if not specified is 15 days)</td> +</tr> +<tr> +<td>PROMETHEUS_SERVER_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>prometheus-server</code>, which is <code>10Gi</code> by default</td> +</tr> +<tr> +<td>PROMETHEUS_SERVER_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>prometheus-server</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>K3S_DATA_DIR</td> +<td>The config of k3s data dir; If not set, the default path is used</td> +</tr> +<tr> +<td>ACME_SERVER</td> +<td>ACME Server url, default use letsencrypt</td> +</tr> +<tr> +<td>ACME_EAB_KEY_ID</td> +<td>The key ID of which your external account binding is indexed by the external account</td> +</tr> +<tr> +<td>ACME_EAB_KEY_SECRET</td> +<td>The key Secret of which your external account symmetric MAC key</td> +</tr> +</tbody> +</table> +<p>Since the installation script will install k3s, other environment variables can refer to k3s installation <a href="https://rancher.com/docs/k3s/latest/en/installation/install-options/">environment variables</a>.</p> +<h2 id="uninstall">Uninstall<a class="td-heading-self-link" href="#uninstall" aria-label="Heading self-link"></a></h2> +<p>If you installed drycc using an installation script, you can uninstall the entire drycc using this script.</p> +<pre tabindex="0"><code>$ curl -sfL https://www.drycc.cc/uninstall.sh | bash - +</code></pre> + + + + + Docs: Specify Gateway + /docs/installing-workflow/gateway/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/installing-workflow/gateway/ + + + + <h2 id="install-drycc-workflow-specify-gateway">Install Drycc Workflow (Specify gateway)<a class="td-heading-self-link" href="#install-drycc-workflow-specify-gateway" aria-label="Heading self-link"></a></h2> +<p>Now that Helm is installed and the repository has been added, install Workflow with a native gateway by running:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Of course, if you deploy it on a bare machine, you probably do not have Load Balancer. You need to use NodePort:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>If you want to use Load Balancer on a bare machine, you can look at <a href="https://github.com/metallb/metallb">metallb</a></p> +<p>Where <code>global.platformDomain</code> is a <strong>required</strong> parameter that is traditionally not required for Workflow that is explained in the next section. In this example we are using <code>drycc.cc</code> for <code>$hostname</code>.</p> +<p>Helm will install a variety of Kubernetes resources in the <code>drycc</code> namespace. +Wait for the pods that Helm launched to be ready. Monitor their status by running:</p> +<pre tabindex="0"><code>$ kubectl --namespace=drycc get pods +</code></pre><p>You should also notice that several Kubernetes gatewayclass has been installed on your cluster. You can view it by running:</p> +<pre tabindex="0"><code>$ kubectl get gatewayclass --namespace drycc +</code></pre><p>Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the +installation: if a component&rsquo;s dependencies are not yet available, that component will exit and Kubernetes will +automatically restart it.</p> +<p>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:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="install-a-kubernetes-gateway">Install a Kubernetes Gateway<a class="td-heading-self-link" href="#install-a-kubernetes-gateway" aria-label="Heading self-link"></a></h2> +<p>Now that Workflow has been deployed with the <code>global.gatewayClass</code> , we will need a Kubernetes gateway in place to begin routing traffic.</p> +<p>Here is an example of how to use <a href="https://istio.io/">istio</a> as an gateway for Workflow. Of course, you are welcome to use any controller you wish.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="configure-dns">Configure DNS<a class="td-heading-self-link" href="#configure-dns" aria-label="Heading self-link"></a></h2> +<p>User must install <a href="/docs/quickstart/install-workflow/">drycc</a> and then set up a hostname, and assumes the <code>*.$host</code> convention.</p> +<p>We need to point the <code>*.$host</code> 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.</p> +<pre tabindex="0"><code>$ kubectl get gateway --namespace drycc +NAME CLASS ADDRESS PROGRAMMED AGE +gateway istio 138.91.243.152 True 36d +</code></pre><p>If we were using <code>drycc.cc</code> as a hostname, we would need to create the following A DNS records.</p> +<table> +<thead> +<tr> +<th>Name</th> +<th style="text-align:center">Type</th> +<th style="text-align:right">Value</th> +</tr> +</thead> +<tbody> +<tr> +<td>*.drycc.cc</td> +<td style="text-align:center">A</td> +<td style="text-align:right">138.91.243.152</td> +</tr> +</tbody> +</table> +<p>Once all of the pods are in the <code>READY</code> state, and <code>*.$host</code> resolves to the external IP found above, the preparation of gateway has been completed!</p> +<p>After installing Workflow, <a href="/docs/quickstart/deploy-an-app/">register a user and deploy an application</a>.</p> +<p>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 <code>80</code> and <code>443</code>.</p> + + + + + + Docs: Installing Drycc Workflow + /docs/installing-workflow/workflow/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/installing-workflow/workflow/ + + + + <p>If help is required getting started with Kubernetes and +Drycc Workflow, follow the <a href="/docs/quickstart/">quickstart guide</a> for assistance.</p> +<h2 id="prerequisites">Prerequisites<a class="td-heading-self-link" href="#prerequisites" aria-label="Heading self-link"></a></h2> +<ol> +<li>Verify the <a href="/docs/installing-workflow/system-requirements/">Kubernetes system requirements</a></li> +<li>Install <a href="/docs/quickstart/install-cli-tools/">Helm and Drycc Workflow CLI</a> tools</li> +</ol> +<h2 id="check-your-setup">Check Your Setup<a class="td-heading-self-link" href="#check-your-setup" aria-label="Heading self-link"></a></h2> +<p>Check that the <code>helm</code> command is available and the version is v2.5.0 or newer.</p> +<pre tabindex="0"><code>$ helm version +Client: &amp;version.Version{SemVer:&#34;v2.5.0&#34;, GitCommit:&#34;012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6&#34;, GitTreeState:&#34;clean&#34;} +Server: &amp;version.Version{SemVer:&#34;v2.5.0&#34;, GitCommit:&#34;012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6&#34;, GitTreeState:&#34;clean&#34;} +</code></pre><h2 id="choose-your-deployment-strategy">Choose Your Deployment Strategy<a class="td-heading-self-link" href="#choose-your-deployment-strategy" aria-label="Heading self-link"></a></h2> +<p>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 <a href="/docs/installing-workflow/configuring-object-storage/">configuring object +storage</a> for more details.</p> +<p>More rigorous installations would benefit from using outside sources for the following things:</p> +<ul> +<li><a href="/docs/installing-workflow/configuring-postgres/">Postgres</a> - For example AWS RDS.</li> +<li><a href="/docs/installing-workflow/configuring-registry/">Registry</a> - This includes <a href="https://quay.io">quay.io</a>, <a href="https://hub.docker.com">dockerhub</a>, <a href="https://aws.amazon.com/ecr/">Amazon ECR</a>, and <a href="https://cloud.google.com/container-registry/">Google GCR</a>.</li> +<li><a href="/docs/managing-workflow/platform-logging/#configuring-off-cluster-redis">Redis</a> - Such as AWS Elasticache</li> +<li><a href="/docs/managing-workflow/platform-monitoring/#off-cluster-grafana">Grafana</a></li> +</ul> +<h4 id="gateway">Gateway<a class="td-heading-self-link" href="#gateway" aria-label="Heading self-link"></a></h4> +<p>Now, workflow requires that gateway and cert-manager must be installed. Any compatible Kubernetes entry controller can be used.</p> +<h2 id="install-drycc-workflow">Install Drycc Workflow<a class="td-heading-self-link" href="#install-drycc-workflow" aria-label="Heading self-link"></a></h2> +<p>If the version of helm is 3.0 +; you need to create the namespace in advance:</p> +<pre tabindex="0"><code>kubectl create ns drycc +</code></pre><p>If you want to change it, set the variable when using helm.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Helm will install a variety of Kubernetes resources in the <code>drycc</code> namespace. +Wait for the pods that Helm launched to be ready. Monitor their status by running:</p> +<pre tabindex="0"><code>$ kubectl --namespace=drycc get pods +</code></pre><p>If it&rsquo;s preferred to have <code>kubectl</code> automatically update as the pod states change, run (type Ctrl-C to stop the watch):</p> +<pre tabindex="0"><code>$ kubectl --namespace=drycc get pods -w +</code></pre><p>Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the +installation: if a component&rsquo;s dependencies are not yet available, that component will exit and Kubernetes will +automatically restart it.</p> +<p>Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Once all of the pods are in the <code>READY</code> state, Drycc Workflow is up and running!</p> +<p>For more installation parameters, please check the <a href="https://github.com/drycc/workflow/blob/main/charts/workflow/values.yaml">values.yaml</a> file of workflow.</p> +<p>After installing Workflow, <a href="/docs/quickstart/deploy-an-app/">register a user and deploy an application</a>.</p> +<h2 id="configure-dns">Configure DNS<a class="td-heading-self-link" href="#configure-dns" aria-label="Heading self-link"></a></h2> +<p>User must to set up a hostname, and assumes the <code>drycc-builder.$host</code> convention.</p> +<p>We need to point the <code>drycc-builder.$host</code> 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.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>If we were using <code>drycc.cc</code> as a hostname, we would need to create the following A DNS records.</p> +<table> +<thead> +<tr> +<th>Name</th> +<th style="text-align:center">Type</th> +<th style="text-align:right">Value</th> +</tr> +</thead> +<tbody> +<tr> +<td>drycc-builder.drycc.cc</td> +<td style="text-align:center">A</td> +<td style="text-align:right">138.91.243.152</td> +</tr> +</tbody> +</table> +<p>Once all of the pods are in the <code>READY</code> state, and <code>drycc-builder.$host</code> resolves to the external IP found above, Workflow is up and running!</p> +<p>After installing Workflow, <a href="/docs/quickstart/deploy-an-app/">register a user and deploy an application</a>.</p> +<p>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 <code>80</code> and <code>443</code>.</p> + + + + + + Docs: Drycc Workflow Roadmap + /docs/roadmap/roadmap/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/roadmap/roadmap/ + + + + <h1 id="drycc-workflow-roadmap">Drycc Workflow Roadmap<a class="td-heading-self-link" href="#drycc-workflow-roadmap" aria-label="Heading self-link"></a></h1> +<p>The Drycc Workflow Roadmap is a community document created as part of the open +<a href="/docs/roadmap/planning-process/">Planning Process</a>. Each roadmap item describes a high-level capability or +grouping of features that are deemed important to the future of Drycc.</p> +<p>Given the project&rsquo;s rapid <a href="/docs/roadmap/releases/">Release Schedule</a>, roadmap +items are designed to provide a sense of direction over many releases.</p> +<h2 id="interactive-drycc-run-binbash">Interactive <code>drycc run /bin/bash</code><a class="td-heading-self-link" href="#interactive-drycc-run-binbash" aria-label="Heading self-link"></a></h2> +<p>Provide the ability for developers to launch an interactive terminal session in +their application environment.</p> +<p>Related issues:</p> +<ul> +<li><a href="https://github.com/drycc/workflow-cli/issues/28">https://github.com/drycc/workflow-cli/issues/28</a></li> +<li><a href="https://github.com/drycc/drycc/issues/117">https://github.com/drycc/drycc/issues/117</a></li> +</ul> +<h2 id="log-streaming">Log Streaming<a class="td-heading-self-link" href="#log-streaming" aria-label="Heading self-link"></a></h2> +<p>Stream application logs via <code>drycc logs -f</code> <a href="https://github.com/drycc/drycc/issues/465">https://github.com/drycc/drycc/issues/465</a></p> +<h2 id="teams-and-permissions">Teams and Permissions<a class="td-heading-self-link" href="#teams-and-permissions" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>Related issues:</p> +<ul> +<li>Deploy Keys: <a href="https://github.com/drycc/drycc/issues/3875">https://github.com/drycc/drycc/issues/3875</a></li> +<li>Teams: <a href="https://github.com/drycc/drycc/issues/4173">https://github.com/drycc/drycc/issues/4173</a></li> +<li>Fine grained permissions: <a href="https://github.com/drycc/drycc/issues/4150">https://github.com/drycc/drycc/issues/4150</a></li> +<li>Admins create apps only: <a href="https://github.com/drycc/drycc/issues/4052">https://github.com/drycc/drycc/issues/4052</a></li> +<li>Admin Certificate Permissions: <a href="https://github.com/drycc/drycc/issues/4576#issuecomment-170987223">https://github.com/drycc/drycc/issues/4576#issuecomment-170987223</a></li> +</ul> +<h2 id="monitoring">Monitoring<a class="td-heading-self-link" href="#monitoring" aria-label="Heading self-link"></a></h2> +<ul> +<li><input disabled="" type="checkbox"> Define and deliver alerts with Kapacitor: <a href="https://github.com/drycc/monitor/issues/44">https://github.com/drycc/monitor/issues/44</a></li> +</ul> +<h2 id="workflow-addonsservices">Workflow Addons/Services<a class="td-heading-self-link" href="#workflow-addonsservices" aria-label="Heading self-link"></a></h2> +<p>Developers should be able to quickly and easily provision application +dependencies using a services or addon abstraction. +<a href="https://github.com/drycc/drycc/issues/231">https://github.com/drycc/drycc/issues/231</a></p> +<h2 id="inboundoutbound-webhooks">Inbound/Outbound Webhooks<a class="td-heading-self-link" href="#inboundoutbound-webhooks" aria-label="Heading self-link"></a></h2> +<p>Drycc Workflow should be able to send and receive webhooks from external +systems. Facilitating integration with third party services like GitHub, +Gitlab, Slack, Hipchat.</p> +<ul> +<li><input checked="" disabled="" type="checkbox"> Send webhook on platform events: <a href="https://github.com/drycc/drycc/issues/1486">https://github.com/drycc/drycc/issues/1486</a> (Workflow v2.10)</li> +</ul> + + + + + + Docs: Troubleshooting using Kubectl + /docs/troubleshooting/kubectl/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/troubleshooting/kubectl/ + + + + <p>This document describes how one can use <code>kubectl</code> to debug any issues with the cluster.</p> +<h2 id="diving-into-the-components">Diving into the Components<a class="td-heading-self-link" href="#diving-into-the-components" aria-label="Heading self-link"></a></h2> +<p>Using <code>kubectl</code>, one can inspect the cluster&rsquo;s current state. When Workflow is installed +with <code>helm</code>, Workflow is installed into the <code>drycc</code> namespace. To inspect if Workflow is +running, run:</p> +<pre><code>$ 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 +</code></pre> +<p>!!! tip +To save precious keystrokes, alias <code>kubectl --namespace=drycc</code> to <code>kd</code> so it is easier to type +in the future.</p> +<p>To fetch the logs of a specific component, use <code>kubectl logs</code>:</p> +<pre><code>$ 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). +[...] +</code></pre> +<p>To dive into a running container to inspect its environment, use <code>kubectl exec</code>:</p> +<pre><code>$ kubectl --namespace=drycc exec -it drycc-database-56v39 gosu postgres psql +psql (13.4 (Debian 13.4-1.pgdg100+1)) +Type &quot;help&quot; 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 &quot;drycc_controller&quot; as user &quot;postgres&quot;. +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) +</code></pre> + + + + + + Docs: Users and Registration + /docs/users/registration/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/users/registration/ + + + + <p>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.</p> +<h2 id="login-to-workflow">Login to Workflow<a class="td-heading-self-link" href="#login-to-workflow" aria-label="Heading self-link"></a></h2> +<p>If you already have an account, use <code>drycc login</code> to authenticate against the Drycc Workflow API.</p> +<pre><code>$ 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 +</code></pre> +<p>Or you can login with username and password +$ drycc login <a href="http://drycc.example.com">http://drycc.example.com</a> &ndash;username=demo &ndash;password=demo +Configuration file written to /root/.drycc/client.json</p> +<h2 id="logout-from-workflow">Logout from Workflow<a class="td-heading-self-link" href="#logout-from-workflow" aria-label="Heading self-link"></a></h2> +<p>Logout of an existing controller session using <code>drycc logout</code>.</p> +<pre><code>$ drycc logout +Logged out as drycc +</code></pre> +<h2 id="verify-your-session">Verify Your Session<a class="td-heading-self-link" href="#verify-your-session" aria-label="Heading self-link"></a></h2> +<p>You can verify your client configuration by running <code>drycc whoami</code>.</p> +<pre><code>$ drycc whoami +You are drycc at http://drycc.example.com +</code></pre> +<p>!!! note +Session and client configuration is stored in the <code>~/.drycc/client.json</code> file.</p> + + + + + + Docs: Components + /docs/understanding-workflow/components/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/understanding-workflow/components/ + + + + <p>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 <a href="/docs/understanding-workflow/architecture/">Workflow architecture</a>.</p> +<p>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!</p> +<h2 id="controller">Controller<a class="td-heading-self-link" href="#controller" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/controller">drycc/controller</a></p> +<p>The controller component is an HTTP API server which serves as the endpoint for +the <code>drycc</code> 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.</p> +<h2 id="passport">Passport<a class="td-heading-self-link" href="#passport" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/passport">drycc/passport</a></p> +<p>The passport component exposes a web API and provide OAuth2 authentication.</p> +<h2 id="database">Database<a class="td-heading-self-link" href="#database" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/postgres">drycc/postgres</a></p> +<p>The database component is a managed instance of <a href="http://www.postgresql.org/">PostgreSQL</a> which holds a +majority of the platforms state. Backups and WAL files are pushed to object +storage via <a href="https://github.com/wal-e/wal-e">WAL-E</a>. When the database is restarted, backups are fetched and +replayed from object storage so no data is lost.</p> +<h2 id="builder">Builder<a class="td-heading-self-link" href="#builder" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/builder">drycc/builder</a></p> +<p>The builder component is responsible for accepting code pushes via <a href="http://git-scm.com/">Git</a> and +managing the build process of your <a href="../reference-guide/terms.md#application">Application</a>. The builder process is:</p> +<ol> +<li>Receives incoming <code>git push</code> requests over SSH</li> +<li>Authenticates the user via SSH key fingerprint</li> +<li>Authorizes the user&rsquo;s access to push code to the Application</li> +<li>Starts the Application Build phase (see below)</li> +<li>Triggers a new <a href="../reference-guide/terms.md#release">Release</a> via the Controller</li> +</ol> +<p>Builder currently supports both buildpack and Dockerfile based builds.</p> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/imagebuilder">drycc/imagebuilder</a></p> +<p>For Buildpack-based deploys, the builder component will launch a one-shot Job +in the <code>drycc</code> namespace. This job runs <code>imagebuilder</code> component which handles +default and custom buildpacks (specified by <code>.packbuilder</code>). The completed image +is pushed to the managed Container registry on cluster. For more information +about buildpacks see <a href="/docs/applications/using-buildpacks/">using buildpacks</a>.</p> +<p>Unlike buildpack-based, For Applications which contain a <code>Dockerfile</code> in the root +of the repository, it generates a Container image (using the underlying Container engine). +For more information see <a href="/docs/applications/using-dockerfiles/">using Dockerfiles</a>.</p> +<h2 id="object-storage">Object Storage<a class="td-heading-self-link" href="#object-storage" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/storage">drycc/storage</a></p> +<p>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.</p> +<p>Workflow supports either on or off-cluster storage. For production deployments +we highly recommend that you configure <a href="/docs/installing-workflow/configuring-object-storage/">off-cluster object storage</a>.</p> +<p>To facilitate experimentation, development and test environments, the default charts for +Workflow include on-cluster storage via <a href="https://github.com/drycc/storage">storage</a>.</p> +<p>If you also feel comfortable using Kubernetes persistent volumes you may +configure storage to use persistent storage available in your environment.</p> +<h2 id="registry">Registry<a class="td-heading-self-link" href="#registry" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/registry">drycc/registry</a></p> +<p>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.</p> +<h2 id="logger-fluentbit-logger">Logger: fluentbit, logger<a class="td-heading-self-link" href="#logger-fluentbit-logger" aria-label="Heading self-link"></a></h2> +<p>The logging subsystem consists of two components. Fluentbit handles log shipping +and logger maintains a ring-buffer of application logs.</p> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/fluentbit">drycc/fluentbit</a></p> +<p>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 <code>drycc logs</code>.</p> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/logger">drycc/logger</a></p> +<p>The <code>logger</code> component receives log streams from <code>fluentbit</code>, 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 <a href="https://github.com/drycc/logger">project +documentation</a>.</p> +<h2 id="monitor">Monitor<a class="td-heading-self-link" href="#monitor" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/monitor">drycc/monitor</a></p> +<p>The monitoring subsystem consists of two components: Telegraf and Grafana.</p> +<p>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.</p> +<p>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&rsquo;s needs.</p> +<h2 id="prometheus">Prometheus<a class="td-heading-self-link" href="#prometheus" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/prometheus">drycc/prometheus</a></p> +<p>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.</p> +<h2 id="rabbitmq">Rabbitmq<a class="td-heading-self-link" href="#rabbitmq" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/rabbitmq">drycc/rabbitmq</a></p> +<p>RabbitMQ is the most widely deployed open source message broker. +Controller use celery with rabbitMQ to execute the asynchronous task.</p> +<h2 id="helmbroker">HelmBroker<a class="td-heading-self-link" href="#helmbroker" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/helmbroker">drycc/rabbitmq</a></p> +<p>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.</p> +<h2 id="prometheus-1">Prometheus<a class="td-heading-self-link" href="#prometheus-1" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/prometheus">drycc/rabbitmq</a></p> +<p>Prometheus is an open-source systemsmonitoring and alerting toolkit originally built atSoundCloud.</p> +<h2 id="see-also">See Also<a class="td-heading-self-link" href="#see-also" aria-label="Heading self-link"></a></h2> +<ul> +<li><a href="/docs/understanding-workflow/concepts/">Workflow Concepts</a></li> +<li><a href="/docs/understanding-workflow/architecture/">Workflow Architecture</a></li> +</ul> + + + + + + Docs: Controller API v2.0 + /docs/reference-guide/controller-api-v2-0/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/reference-guide/controller-api-v2-0/ + + + + <h2 id="whats-new">What&rsquo;s New<a class="td-heading-self-link" href="#whats-new" aria-label="Heading self-link"></a></h2> +<p><strong>New!</strong> format of <code>POST /v2/apps/&lt;app id&gt;/run</code> has changed.</p> +<h2 id="authentication">Authentication<a class="td-heading-self-link" href="#authentication" aria-label="Heading self-link"></a></h2> +<h3 id="register-a-new-user">Register a New User<a class="td-heading-self-link" href="#register-a-new-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/register/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{ + &#34;username&#34;: &#34;test&#34;, + &#34;password&#34;: &#34;opensesame&#34;, + &#34;email&#34;: &#34;test@example.com&#34; +} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] +} +</code></pre><h3 id="log-in">Log in<a class="td-heading-self-link" href="#log-in" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/login/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{&#34;username&#34;: &#34;test&#34;, &#34;password&#34;: &#34;opensesame&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="cancel-account">Cancel Account<a class="td-heading-self-link" href="#cancel-account" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/auth/cancel/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="regenerate-token">Regenerate Token<a class="td-heading-self-link" href="#regenerate-token" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command could require administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/tokens/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;username&#34; : &#34;test&#34; + &#34;all&#34; : &#34;true&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="change-password">Change Password<a class="td-heading-self-link" href="#change-password" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/passwd/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;password&#34;: &#34;foo&#34;, + &#34;new_password&#34;: &#34;bar&#34; +} +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;username&#34;: &#34;testuser&#34;} +</code></pre><blockquote> +<p><strong>note</strong></p> +<p>Using the <code>username</code> parameter requires administrative privileges and makes the <code>password</code> parameter optional.</p> +</blockquote> +<p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="applications">Applications<a class="td-heading-self-link" href="#applications" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-applications">List all Applications<a class="td-heading-self-link" href="#list-all-applications" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;id&#34;: &#34;example-go&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="destroy-an-application">Destroy an Application<a class="td-heading-self-link" href="#destroy-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="list-application-details">List Application Details<a class="td-heading-self-link" href="#list-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="update-application-details">Update Application Details<a class="td-heading-self-link" href="#update-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{ + &#34;owner&#34;: &#34;test&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 1.8.0 +Content-Type: application/json +</code></pre><h3 id="retrieve-application-logs">Retrieve Application Logs<a class="td-heading-self-link" href="#retrieve-application-logs" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/logs/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional URL Query Parameters:</p> +<pre tabindex="0"><code>?log_lines= +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: text/plain + +&#34;16:51:14 drycc[api]: test created initial release\n&#34; +</code></pre><h3 id="run-one-off-commands">Run one-off Commands<a class="td-heading-self-link" href="#run-one-off-commands" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>POST /v2/apps/example-go/run/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;command&#34;: &#34;echo hi&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;exit_code&#34;: 0, &#34;output&#34;: &#34;hi\n&#34;} +</code></pre><h2 id="certificates">Certificates<a class="td-heading-self-link" href="#certificates" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-certificates">List all Certificates<a class="td-heading-self-link" href="#list-all-certificates" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; + } + ] +} +</code></pre><h3 id="get-certificate-details">Get Certificate Details<a class="td-heading-self-link" href="#get-certificate-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="create-certificate">Create Certificate<a class="td-heading-self-link" href="#create-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{ + &#34;name&#34;: &#34;foo&#34; + &#34;certificate&#34;: &#34;-----BEGIN CERTIFICATE-----&#34;, + &#34;key&#34;: &#34;-----BEGIN RSA PRIVATE KEY-----&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="destroy-a-certificate">Destroy a Certificate<a class="td-heading-self-link" href="#destroy-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="attach-a-domain-to-a-certificate">Attach a Domain to a Certificate<a class="td-heading-self-link" href="#attach-a-domain-to-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/foo/domain/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;domain&#34;: &#34;test.com&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="remove-a-domain-from-a-certificate">Remove a Domain from a Certificate<a class="td-heading-self-link" href="#remove-a-domain-from-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="pods">Pods<a class="td-heading-self-link" href="#pods" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-pods">List all Pods<a class="td-heading-self-link" href="#list-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="list-all-pods-by-type">List all Pods by Type<a class="td-heading-self-link" href="#list-all-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/web/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="restart-all-pods">Restart All Pods<a class="td-heading-self-link" href="#restart-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type">Restart Pods by Type<a class="td-heading-self-link" href="#restart-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type-and-name">Restart Pods by Type and Name<a class="td-heading-self-link" href="#restart-pods-by-type-and-name" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="scale-pods">Scale Pods<a class="td-heading-self-link" href="#scale-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/scale/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;web&#34;: 3} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="configuration">Configuration<a class="td-heading-self-link" href="#configuration" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-configuration">List Application Configuration<a class="td-heading-self-link" href="#list-application-configuration" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="create-new-config">Create new Config<a class="td-heading-self-link" href="#create-new-config" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: &#34;world&#34;, &#34;PLATFORM&#34;: &#34;drycc&#34;}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json +X-Drycc-Release: 3 + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v3&#34;, + &#34;HELLO&#34;: &#34;world&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="unset-config-variable">Unset Config Variable<a class="td-heading-self-link" href="#unset-config-variable" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: null}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json +X-Drycc-Release: 4 + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v4&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="domains">Domains<a class="td-heading-self-link" href="#domains" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-domains">List Application Domains<a class="td-heading-self-link" href="#list-application-domains" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; + } + ] +} +</code></pre><h3 id="add-domain">Add Domain<a class="td-heading-self-link" href="#add-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#39;domain&#39;: &#39;example.example.com&#39;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; +} +</code></pre><h3 id="remove-domain">Remove Domain<a class="td-heading-self-link" href="#remove-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="builds">Builds<a class="td-heading-self-link" href="#builds" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-builds">List Application Builds<a class="td-heading-self-link" href="#list-application-builds" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\&#34;/runner/init\&#34;] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db&#34;, + &#34;image&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: { + &#34;web&#34;: &#34;example-go&#34; + }, + &#34;sha&#34;: &#34;060da68f&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-application-build">Create Application Build<a class="td-heading-self-link" href="#create-application-build" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;image&#34;: &#34;drycc/example-go:latest&#34;} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;procfile&#34;: { + &#34;web&#34;: &#34;./cmd&#34; + } +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json +X-Drycc-Release: 4 + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;&#34;, + &#34;image&#34;: &#34;drycc/example-go:latest&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: {}, + &#34;sha&#34;: &#34;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-releases">List Application Releases<a class="td-heading-self-link" href="#list-application-releases" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 3, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;202d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;ed637ceb-5d32-44bd-9406-d326a777a513&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test changed nothing&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 3 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;202d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test deployed 060da68&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 2 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 + } + ] +} +</code></pre><h3 id="list-release-details">List Release Details<a class="td-heading-self-link" href="#list-release-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/v2/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 +} +</code></pre><h3 id="rollback-release">Rollback Release<a class="td-heading-self-link" href="#rollback-release" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;version&#34;: 1} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;version&#34;: 5} +</code></pre><h2 id="keys">Keys<a class="td-heading-self-link" href="#keys" aria-label="Heading self-link"></a></h2> +<h3 id="list-keys">List Keys<a class="td-heading-self-link" href="#list-keys" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;test@example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="add-key-to-user">Add Key to User<a class="td-heading-self-link" href="#add-key-to-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;id&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example&#34;, + &#34;owner&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="remove-key-from-user">Remove Key from User<a class="td-heading-self-link" href="#remove-key-from-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/keys/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="permissions">Permissions<a class="td-heading-self-link" href="#permissions" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-permissions">List Application Permissions<a class="td-heading-self-link" href="#list-application-permissions" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This does not include the app owner.</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;users&#34;: [ + &#34;test&#34;, + &#34;foo&#34; + ] +} +</code></pre><h3 id="create-application-permission">Create Application Permission<a class="td-heading-self-link" href="#create-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="remove-application-permission">Remove Application Permission<a class="td-heading-self-link" href="#remove-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="list-administrators">List Administrators<a class="td-heading-self-link" href="#list-administrators" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/admin/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 2, + &#34;next&#34;: null + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;username&#34;: &#34;test&#34;, + &#34;is_superuser&#34;: true + }, + { + &#34;username&#34;: &#34;foo&#34;, + &#34;is_superuser&#34;: true + } + ] +} +</code></pre><h3 id="grant-user-administrative-privileges">Grant User Administrative Privileges<a class="td-heading-self-link" href="#grant-user-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/admin/perms HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="remove-users-administrative-privileges">Remove User&rsquo;s Administrative Privileges<a class="td-heading-self-link" href="#remove-users-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/admin/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="users">Users<a class="td-heading-self-link" href="#users" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-users">List all users<a class="td-heading-self-link" href="#list-all-users" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/users HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] + } + ] +} +</code></pre> + + + + + Docs: Deploy Hooks + /docs/managing-workflow/deploy-hooks/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/deploy-hooks/ + + + + <p>It’s useful to help keep the development team informed about deploys, while +it can also be used to integrate different systems together.</p> +<p>After one or more hooks are setup, hook output and errors appear in your application’s logs:</p> +<pre tabindex="0"><code>$ drycc logs +... +2011-03-15T15:07:29-07:00 drycc[api]: Deploy hook sent to http://drycc.rocks +</code></pre><p>Deploy hooks are a generic HTTP hook. An administrator can create and configure multiple deploy +hooks by <a href="/docs/managing-workflow/tuning-component-settings/#customizing-the-controller">tuning the controller settings</a> via the Helm chart.</p> +<h2 id="http-post-hook">HTTP POST Hook<a class="td-heading-self-link" href="#http-post-hook" aria-label="Heading self-link"></a></h2> +<p>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: <code>app</code>, <code>release</code>, <code>release_summary</code>, <code>sha</code> and +<code>user</code>. See below for their descriptions:</p> +<pre tabindex="0"><code>app=secure-woodland&amp;release=v4&amp;release_summary=gabrtv%20deployed%35b3726&amp;sha=35b3726&amp;user=gabrtv +</code></pre><p>Optionally, if a deploy hook secret key is added to the controller through +<a href="/docs/managing-workflow/tuning-component-settings/#customizing-the-controller">tuning the controller settings</a>, a new <code>Authorization</code> header will be +present in the POST request. The value of this header is computed as the <a href="https://en.wikipedia.org/wiki/Hash-based_message_authentication_code">HMAC</a> hex digest of the +request URL, using the secret as the key.</p> +<p>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:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#204a87;font-weight:bold">import</span> <span style="color:#000">hashlib</span> +</span></span><span style="display:flex;"><span><span style="color:#204a87;font-weight:bold">import</span> <span style="color:#000">hmac</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#000">hmac</span><span style="color:#ce5c00;font-weight:bold">.</span><span style="color:#000">new</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;my_secret_key&#34;</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#4e9a06">&#34;http://drycc.rocks?app=secure-woodland&amp;release=v4&amp;release_summary=gabrtv</span><span style="color:#4e9a06">%20d</span><span style="color:#4e9a06">eployed%35b3726&amp;sha=35b3726&amp;user=gabrtv&#34;</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">digestmod</span><span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#000">hashlib</span><span style="color:#ce5c00;font-weight:bold">.</span><span style="color:#000">sha1</span><span style="color:#000;font-weight:bold">)</span><span style="color:#ce5c00;font-weight:bold">.</span><span style="color:#000">hexdigest</span><span style="color:#000;font-weight:bold">()</span> +</span></span></code></pre></div><p>If the value of the computed HMAC hex digest and the value in the <code>Authorization</code> header are +identical, then the request came from Workflow.</p> +<p>!!! 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&rsquo;t care about +the order of the HTTP parameters, but the cryptographic signature will not be the same.</p> + + + + + + Docs: Using Dockerfiles + /docs/applications/using-dockerfiles/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/using-dockerfiles/ + + + + <p>Drycc supports deploying applications via Dockerfiles. A <a href="https://docs.docker.com/reference/builder/">Dockerfile</a> automates the steps for crafting a [Container Image][]. +Dockerfiles are incredibly powerful but require some extra work to define your exact application runtime environment.</p> +<h2 id="add-ssh-key">Add SSH Key<a class="td-heading-self-link" href="#add-ssh-key" aria-label="Heading self-link"></a></h2> +<p>For <strong>Dockerfile</strong> based application deploys via <code>git push</code>, Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user.</p> +<ul> +<li> +<p>See <a href="/docs/users/ssh-keys/#generate-an-ssh-key">this document</a> for instructions on how to generate an SSH key.</p> +</li> +<li> +<p>Run <code>drycc keys:add</code> to upload your SSH key to Drycc Workflow.</p> +</li> +</ul> +<pre tabindex="0"><code>$ drycc keys:add ~/.ssh/id_drycc.pub +Uploading id_drycc.pub to drycc... done +</code></pre><p>Read more about adding/removing SSH Keys <a href="/docs/users/ssh-keys/#adding-and-removing-ssh-keys">here</a>.</p> +<h2 id="prepare-an-application">Prepare an Application<a class="td-heading-self-link" href="#prepare-an-application" aria-label="Heading self-link"></a></h2> +<p>If you do not have an existing application, you can clone an example application that demonstrates the Dockerfile workflow.</p> +<pre><code>$ git clone https://github.com/drycc/helloworld.git +$ cd helloworld +</code></pre> +<h3 id="dockerfile-requirements">Dockerfile Requirements<a class="td-heading-self-link" href="#dockerfile-requirements" aria-label="Heading self-link"></a></h3> +<p>In order to deploy Dockerfile applications, they must conform to the following requirements:</p> +<ul> +<li>The Dockerfile must use the <code>EXPOSE</code> directive to expose exactly one port.</li> +<li>That port must be listening for an HTTP connection.</li> +<li>The Dockerfile must use the <code>CMD</code> directive to define the default process that will run within the container.</li> +<li>The Container image must contain <a href="https://www.gnu.org/software/bash/">bash</a> to run processes.</li> +</ul> +<p>!!! note +Note that if you are using a private registry of any kind (<code>gcr</code> or other) the application environment must include a <code>$PORT</code> config variable that matches the <code>EXPOSE</code>&rsquo;d port, example: <code>drycc config:set PORT=5000</code>. See <a href="/docs/installing-workflow/configuring-registry/#configuring-off-cluster-private-registry">Configuring Registry</a> for more info.</p> +<h2 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h2> +<p>Use <code>drycc create</code> to create an application on the <a href="/docs/understanding-workflow/components/#controller">Controller</a>.</p> +<pre><code>$ drycc create +Creating application... done, created folksy-offshoot +Git remote drycc added +</code></pre> +<h2 id="push-to-deploy">Push to Deploy<a class="td-heading-self-link" href="#push-to-deploy" aria-label="Heading self-link"></a></h2> +<p>Use <code>git push drycc master</code> to deploy your application.</p> +<pre><code>$ 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) +-----&gt; Building Docker image +Uploading context 4.096 kB +Uploading context +Step 0 : FROM drycc/base:latest + ---&gt; 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 + ---&gt; Using cache + ---&gt; cf9ef8c5caa7 +Step 2 : RUN tar -C /usr/local -xzf /tmp/go1.2.1.linux-amd64.tar.gz + ---&gt; Using cache + ---&gt; 515b1faf3bd8 +Step 3 : RUN mkdir -p /go + ---&gt; Using cache + ---&gt; ebf4927a00e9 +Step 4 : ENV GOPATH /go + ---&gt; Using cache + ---&gt; c6a276eded37 +Step 5 : ENV PATH /usr/local/go/bin:/go/bin:$PATH + ---&gt; Using cache + ---&gt; 2ba6f6c9f108 +Step 6 : ADD . /go/src/github.com/drycc/helloworld + ---&gt; 94ab7f4b977b +Removing intermediate container 171b7d9fdb34 +Step 7 : RUN cd /go/src/github.com/drycc/helloworld &amp;&amp; go install -v . + ---&gt; Running in 0c8fbb2d2812 +github.com/drycc/helloworld + ---&gt; 13b5af931393 +Removing intermediate container 0c8fbb2d2812 +Step 8 : ENV PORT 80 + ---&gt; Running in 9b07da36a272 + ---&gt; 2dce83167874 +Removing intermediate container 9b07da36a272 +Step 9 : CMD [&quot;/go/bin/helloworld&quot;] + ---&gt; Running in f7b215199940 + ---&gt; b1e55ce5195a +Removing intermediate container f7b215199940 +Step 10 : EXPOSE 80 + ---&gt; Running in 7eb8ec45dcb0 + ---&gt; ea1a8cc93ca3 +Removing intermediate container 7eb8ec45dcb0 +Successfully built ea1a8cc93ca3 +-----&gt; Pushing image to private registry + + Launching... done, v2 + +-----&gt; 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 -&gt; master + +$ curl -s http://folksy-offshoot.local3.dryccapp.com +Welcome to Drycc! +See the documentation at http://docs.drycc.cc/ for more information. +</code></pre> +<p>Because a Dockerfile application is detected, the <code>web</code> process type is automatically scaled to 1 on first deploy.</p> +<p>Use <code>drycc scale web=3</code> to increase <code>web</code> processes to 3, for example. Scaling a +process type directly changes the number of <a href="../reference-guide/terms.md#container">containers</a> +running that process.</p> +<h2 id="container-build-arguments">Container Build Arguments<a class="td-heading-self-link" href="#container-build-arguments" aria-label="Heading self-link"></a></h2> +<p>As of Workflow v2.13.0, users can inject their application config into the Container image using +<a href="https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables---build-arg">Container build arguments</a>. To opt into this, users must add a new environment variable +to their application:</p> +<pre tabindex="0"><code>$ drycc config:set DRYCC_DOCKER_BUILD_ARGS_ENABLED=1 +</code></pre><p>Every environment variable set with <code>drycc config:set</code> will then be available for use inside the +user&rsquo;s Dockerfile. For example, if a user runs <code>drycc config:set POWERED_BY=Workflow</code>, +the user can utilize that build argument in their Dockerfile:</p> +<pre tabindex="0"><code>ARG POWERED_BY +RUN echo &#34;Powered by $POWERED_BY&#34; &gt; /etc/motd +</code></pre> + + + + + Docs: Development Environment + /docs/contribution-guidelines/development-environment/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/development-environment/ + + + + <p>In this guide, we walk you through the process of setting up a development environment that is suitable for hacking on most Drycc components.</p> +<p>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.</p> +<p>!!! 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 <a href="https://github.com/drycc/router">drycc/router</a> project for a working example of a fully containerized development environment.</p> +<p>If you&rsquo;re just getting into the Drycc codebase, look for GitHub issues with the label <a href="https://github.com/issues?q=user%3Adrycc+label%3Aeasy-fix+is%3Aopen">easy-fix</a>. These are more straightforward or low-risk issues and are a great way to become more familiar with Drycc.</p> +<h2 id="prerequisites">Prerequisites<a class="td-heading-self-link" href="#prerequisites" aria-label="Heading self-link"></a></h2> +<p>In order to successfully compile and test Drycc binaries and build Container images of Drycc components, the following are required:</p> +<ul> +<li><a href="https://git-scm.com/">git</a></li> +<li>Go 1.5 or later, with support for compiling to <code>linux/amd64</code></li> +<li><a href="https://github.com/Masterminds/glide">glide</a></li> +<li><a href="https://github.com/golang/lint">golint</a></li> +<li><a href="https://github.com/koalaman/shellcheck">shellcheck</a></li> +<li><a href="https://podman.io/">Podman</a> (in a non-Linux environment, you will additionally want [Podman Machine][machine])</li> +</ul> +<p>For <a href="https://github.com/drycc/controller">drycc/controller</a>, in particular, you will also need:</p> +<ul> +<li>Python 2.7 or later (with <code>pip</code>)</li> +<li>virtualenv (<code>sudo pip install virtualenv</code>)</li> +</ul> +<p>In most cases, you should simply install according to the instructions. There are a few special cases, though. We cover these below.</p> +<h3 id="configuring-go">Configuring Go<a class="td-heading-self-link" href="#configuring-go" aria-label="Heading self-link"></a></h3> +<p>If your local workstation does not support the <code>linux/amd64</code> 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.</p> +<p>Homebrew users can just install with cross compiling support:</p> +<pre tabindex="0"><code>$ brew install go --with-cc-common +</code></pre><p>It is also straightforward to build Go from source:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Once you can compile to <code>linux/amd64</code>, you should be able to compile Drycc components as normal.</p> +<h2 id="fork-the-repository">Fork the Repository<a class="td-heading-self-link" href="#fork-the-repository" aria-label="Heading self-link"></a></h2> +<p>Once the prerequisites have been met, we can begin to work with Drycc components.</p> +<p>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 <code>$GOPATH/src/github.com/drycc/</code>.</p> +<pre tabindex="0"><code>$ mkdir -p $GOPATH/src/github.com/drycc +$ cd $GOPATH/src/github.com/drycc +$ git clone git@github.com:&lt;username&gt;/&lt;component&gt;.git +$ cd &lt;component&gt; +</code></pre><p>!!! note +By checking out the forked copy into the namespace <code>github.com/drycc/&lt;component&gt;</code>, we are tricking the Go toolchain into seeing our fork as the &ldquo;official&rdquo; source tree.</p> +<p>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&rsquo;s main branch. There are various strategies for doing this, but the <a href="https://help.github.com/articles/fork-a-repo/">most common</a> is to add an <code>upstream</code> remote:</p> +<pre tabindex="0"><code>$ git remote add upstream https://github.com/drycc/&lt;component&gt;.git +</code></pre><p>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:</p> +<pre tabindex="0"><code>$ export DRYCC=$GOPATH/src/github.com/drycc +</code></pre><p>Throughout the rest of this document, <code>$DRYCC</code> refers to that location.</p> +<h3 id="alternative-forking-with-a-pushurl">Alternative: Forking with a Pushurl<a class="td-heading-self-link" href="#alternative-forking-with-a-pushurl" aria-label="Heading self-link"></a></h3> +<p>A number of Drycc contributors prefer to pull directly from <code>drycc/&lt;component&gt;</code>, but push to <code>&lt;username&gt;/&lt;component&gt;</code>. If that workflow suits you better, you can set it up this way:</p> +<pre tabindex="0"><code>$ git clone git@github.com:drycc/&lt;component&gt;.git +$ cd drycc +$ git config remote.origin.pushurl git@github.com:&lt;username&gt;/&lt;component&gt;.git +</code></pre><p>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.</p> +<h2 id="make-your-changes">Make Your Changes<a class="td-heading-self-link" href="#make-your-changes" aria-label="Heading self-link"></a></h2> +<p>With your development environment set up and the code you wish to work on forked and cloned, you can begin making your changes.</p> +<h2 id="test-your-changes">Test Your Changes<a class="td-heading-self-link" href="#test-your-changes" aria-label="Heading self-link"></a></h2> +<p>Drycc components each include a comprehensive suite of automated tests, mostly written in Go. See <a href="/docs/contribution-guidelines/testing/">testing</a> for instructions on running the tests.</p> +<h2 id="deploying-your-changes">Deploying Your Changes<a class="td-heading-self-link" href="#deploying-your-changes" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<h3 id="running-a-kubernetes-cluster-for-development">Running a Kubernetes Cluster for Development<a class="td-heading-self-link" href="#running-a-kubernetes-cluster-for-development" aria-label="Heading self-link"></a></h3> +<p>To run a Kubernetes cluster locally or elsewhere to support your development activities, refer to Drycc installation instructions <a href="/docs/quickstart/">here</a>.</p> +<h3 id="using-a-development-registry">Using a Development Registry<a class="td-heading-self-link" href="#using-a-development-registry" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p>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 <em>as</em> a Container container.</p> +<p>To facilitate this, most Drycc components provide a make target to create such a registry:</p> +<pre tabindex="0"><code>$ make dev-registry +</code></pre><p>In a Linux environment, to begin using the registry:</p> +<pre tabindex="0"><code>export DRYCC_REGISTRY=&lt;IP of the host machine&gt;:5000 +</code></pre><p>In non-Linux environments:</p> +<pre tabindex="0"><code>export DRYCC_REGISTRY=&lt;IP of the drycc Container Machine VM&gt;:5000 +</code></pre><p>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 <a href="https://quay.io/">quay.io</a> will suffice.</p> +<p>To use DockerHub for this purpose, for instance:</p> +<pre tabindex="0"><code>$ export DRYCC_REGISTRY=&#34;registry.drycc.cc&#34; +$ export IMAGE_PREFIX=&lt;your DockerHub username&gt; +</code></pre><p>To use quay.io:</p> +<pre tabindex="0"><code>$ export DRYCC_REGISTRY=quay.io +$ export IMAGE_PREFIX=&lt;your quay.io username&gt; +</code></pre><p>Note the importance of the trailing slash.</p> +<h3 id="dev--deployment-workflow">Dev / Deployment Workflow<a class="td-heading-self-link" href="#dev--deployment-workflow" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p>In the general case, this workflow looks like this:</p> +<ol> +<li>Update source code and commit your changes using <code>git</code></li> +<li>Use <code>make build</code> to build a new Container image</li> +<li>Use <code>make dev-release</code> to generate Kubernetes manifest(s)</li> +<li>Use <code>make deploy</code> to restart the component using the updated manifest</li> +</ol> +<p>This can be shortened to a one-liner using just the <code>deploy</code> target:</p> +<pre tabindex="0"><code>$ make deploy +</code></pre><h2 id="useful-commands">Useful Commands<a class="td-heading-self-link" href="#useful-commands" aria-label="Heading self-link"></a></h2> +<p>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:</p> +<h3 id="see-all-drycc-pods">See All Drycc Pods<a class="td-heading-self-link" href="#see-all-drycc-pods" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>$ kubectl --namespace=drycc get pods +</code></pre><h3 id="describe-a-pod">Describe a Pod<a class="td-heading-self-link" href="#describe-a-pod" aria-label="Heading self-link"></a></h3> +<p>This is often useful for troubleshooting pods that are in pending or crashed states:</p> +<pre tabindex="0"><code>$ kubectl --namespace=drycc describe -f &lt;pod name&gt; +</code></pre><h3 id="tail-logs">Tail Logs<a class="td-heading-self-link" href="#tail-logs" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>$ kubectl --namespace=drycc logs -f &lt;pod name&gt; +</code></pre><h3 id="django-shell">Django Shell<a class="td-heading-self-link" href="#django-shell" aria-label="Heading self-link"></a></h3> +<p>Specific to <a href="https://github.com/drycc/controller">drycc/controller</a></p> +<pre tabindex="0"><code>$ kubectl --namespace=drycc exec -it &lt;pod name&gt; -- python manage.py shell +</code></pre><p>Have commands other Drycc contributors might find useful? Send us a PR!</p> +<h2 id="pull-requests">Pull Requests<a class="td-heading-self-link" href="#pull-requests" aria-label="Heading self-link"></a></h2> +<p>Satisfied with your changes? Share them!</p> +<p>Please read <a href="/docs/contribution-guidelines/submitting-a-pull-request/">Submitting a Pull Request</a>. It contains a checklist of +things you should do when proposing a change to any Drycc component.</p> + + + + + + Docs: Drycc Workflow Client CLI + /docs/quickstart/install-cli-tools/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/quickstart/install-cli-tools/ + + + + <h2 id="drycc-workflow-client-cli">Drycc Workflow Client CLI<a class="td-heading-self-link" href="#drycc-workflow-client-cli" aria-label="Heading self-link"></a></h2> +<p>The Drycc command-line interface (CLI), lets you interact with Drycc Workflow. +Use the CLI to create and configure and manage applications.</p> +<p>Install the <code>drycc</code> client for Linux or Mac OS X with:</p> +<pre tabindex="0"><code>$ curl -sfL https://www.drycc.cc/install-cli.sh | bash - +</code></pre><p>!!! important +Users in Chinese mainland can use the following methods to speed up installation:</p> +<pre><code>``` +$ curl -sfL https://www.drycc.cc/install-cli.sh | INSTALL_DRYCC_MIRROR=cn bash - +``` +</code></pre> +<p>Others please visit: <a href="https://github.com/drycc/workflow-cli/releases">https://github.com/drycc/workflow-cli/releases</a></p> +<p>The installer places the <code>drycc</code> binary in your current directory, but you +should move it somewhere in your $PATH:</p> +<pre tabindex="0"><code>$ sudo ln -fs $PWD/drycc /usr/local/bin/drycc +</code></pre><p><em>or</em>:</p> +<pre tabindex="0"><code>$ sudo mv $PWD/drycc /usr/local/bin/drycc +</code></pre><p>Check your work by running <code>drycc version</code>:</p> +<pre tabindex="0"><code>$ drycc version +v1.1.0 +</code></pre><p>Update workflow cli to latest release.</p> +<pre tabindex="0"><code>drycc update +</code></pre><p>!!! note +Note that version numbers may vary as new releases become available</p> + + + + + + Docs: Releases + /docs/roadmap/releases/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/roadmap/releases/ + + + + <p>Drycc uses a <a href="https://en.wikipedia.org/wiki/Continuous_delivery">continuous delivery</a> approach for creating releases. Every merged commit that passes +testing results in a deliverable that can be given a <a href="http://semver.org">semantic version</a> tag and shipped.</p> +<p>The master <code>git</code> branch of a project should always work. Only changes considered ready to be +released publicly are merged.</p> +<h2 id="components-release-as-needed">Components Release as Needed<a class="td-heading-self-link" href="#components-release-as-needed" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>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.</p> +<p>&ldquo;Components&rdquo; 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 <a href="http://semver.org">semantic version</a> releases.</p> +<p>See &ldquo;<a href="/docs/roadmap/releases/#how-to-release-a-component">How to Release a Component</a>&rdquo; for more detail.</p> +<h2 id="workflow-releases-each-month">Workflow Releases Each Month<a class="td-heading-self-link" href="#workflow-releases-each-month" aria-label="Heading self-link"></a></h2> +<p>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 <a href="/docs/roadmap/roadmap/">the Roadmap</a>.</p> +<p>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.</p> +<p>See &ldquo;<a href="/docs/roadmap/releases/#how-to-release-workflow">How to Release Workflow</a>&rdquo; for more detail.</p> +<h2 id="semantic-versioning">Semantic Versioning<a class="td-heading-self-link" href="#semantic-versioning" aria-label="Heading self-link"></a></h2> +<p>Drycc releases comply with <a href="http://semver.org">semantic versioning</a>, with the &ldquo;public API&rdquo; broadly +defined as:</p> +<ul> +<li>REST, gRPC, or other API that is network-accessible</li> +<li>Library or framework API intended for public use</li> +<li>&ldquo;Pluggable&rdquo; socket-level protocols users can redirect</li> +<li>CLI commands and output formats</li> +</ul> +<p>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.</p> +<h2 id="how-to-release-a-component">How to Release a Component<a class="td-heading-self-link" href="#how-to-release-a-component" aria-label="Heading self-link"></a></h2> +<p>Most Drycc projects are &ldquo;components&rdquo; which produce a Container image or binary executable as a +deliverable. This section leads a maintainer through creating a component release.</p> +<h3 id="step-1-update-code-and-run-the-release-tool">Step 1: Update Code and Run the Release Tool<a class="td-heading-self-link" href="#step-1-update-code-and-run-the-release-tool" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p><strong>Note:</strong> if a patch release, the release artifact will have to be manually promoted by triggering +the <a href="https://ci.drycc.info/job/component-promote">component-promote</a> job with the following values:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#000">COMPONENT_NAME</span><span style="color:#ce5c00;font-weight:bold">=</span>&lt;component name&gt; +</span></span><span style="display:flex;"><span><span style="color:#000">COMPONENT_SHA</span><span style="color:#ce5c00;font-weight:bold">=</span>&lt;patch commit sha&gt; +</span></span></code></pre></div><p>Make sure you have the <a href="https://github.com/drycc/dryccrel">dryccrel</a> release tool in your search <code>$PATH</code>.</p> +<p>Run <code>dryccrel release</code> once with a fake semver tag to proofread the changelog content. (If <code>HEAD</code> +of master is not what is intended for the release, add the <code>--sha</code> flag as described +in <code>dryccrel release --help</code>.)</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ dryccrel release controller v0.0.0 +</span></span><span style="display:flex;"><span>Doing a dry run of the component release... +</span></span><span style="display:flex;"><span>skipping commit 943a49267eeb28546819a266654806cfcbae0e38 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>Creating changelog <span style="color:#204a87;font-weight:bold">for</span> controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#8f5902;font-style:italic">### v2.8.1 -&gt; v0.0.0</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#8f5902;font-style:italic">#### Fixes</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>- <span style="color:#ce5c00;font-weight:bold">[</span><span style="color:#4e9a06">`</span>615b834<span style="color:#4e9a06">`</span><span style="color:#ce5c00;font-weight:bold">](</span>https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731<span style="color:#ce5c00;font-weight:bold">)</span> boot: Ensure <span style="color:#000">DRYCC_DEBUG</span><span style="color:#ce5c00;font-weight:bold">==</span><span style="color:#204a87">true</span> <span style="color:#204a87;font-weight:bold">for</span> debug output +</span></span></code></pre></div><p>Based on the changelog content, determine whether the component deserves a minor or patch +release. Run the command again with that semver tag and <code>--dry-run=false</code>. You will still be +asked for confirmation before the release is created:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ dryccrel release controller v2.8.2 --dry-run<span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#204a87">false</span> +</span></span><span style="display:flex;"><span>skipping commit 943a49267eeb28546819a266654806cfcbae0e38 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>Creating changelog <span style="color:#204a87;font-weight:bold">for</span> controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#8f5902;font-style:italic">### v2.8.1 -&gt; v2.8.2</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#8f5902;font-style:italic">#### Fixes</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>- <span style="color:#ce5c00;font-weight:bold">[</span><span style="color:#4e9a06">`</span>615b834<span style="color:#4e9a06">`</span><span style="color:#ce5c00;font-weight:bold">](</span>https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731<span style="color:#ce5c00;font-weight:bold">)</span> boot: Ensure <span style="color:#000">DRYCC_DEBUG</span><span style="color:#ce5c00;font-weight:bold">==</span><span style="color:#204a87">true</span> <span style="color:#204a87;font-weight:bold">for</span> debug output +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>Please review the above changelog contents and ensure: +</span></span><span style="display:flex;"><span> 1. All intended commits are mentioned +</span></span><span style="display:flex;"><span> 2. The changes agree with the semver release tag <span style="color:#ce5c00;font-weight:bold">(</span>major, minor, or patch<span style="color:#ce5c00;font-weight:bold">)</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>Create release <span style="color:#204a87;font-weight:bold">for</span> Drycc Controller v2.8.2? <span style="color:#ce5c00;font-weight:bold">[</span>y/n<span style="color:#ce5c00;font-weight:bold">]</span>: y +</span></span><span style="display:flex;"><span>New release is available at https://github.com/drycc/controller/releases/tag/v2.8.2 +</span></span></code></pre></div><h3 id="step-2-verify-the-component-is-available">Step 2: Verify the Component is Available<a class="td-heading-self-link" href="#step-2-verify-the-component-is-available" aria-label="Heading self-link"></a></h3> +<p>Tagging the component (see <a href="/roadmap/releases/#step-1-update-code-and-run-the-release-tool">Step 1</a>) +starts a CI job that eventually results in an artifact being made available for public download. +Please see the <a href="https://github.com/drycc/jenkins-jobs/#flow">CI flow diagrams</a> for details.</p> +<p>Double-check that the artifact is available, either by a <code>podman pull</code> command or by running the +appropriate installer script.</p> +<p>If the artifact can&rsquo;t be downloaded, ensure that its CI release jobs are still in progress, or +fix whatever issue arose in the pipeline. For example, the +<a href="https://github.com/drycc/jenkins-jobs/#when-a-component-pr-is-merged-to-master">master merge pipeline</a> +may have failed to promote the <code>:git-abc1d23</code> candidate image and needs to be restarted with +that component and commit.</p> +<p>If the component has a correlating <a href="https://github.com/kubernetes/helm">Kubernetes Helm</a> chart, +this chart will also be packaged, signed and uploaded to its production chart repo. Please +verify it can be fetched (and verified):</p> +<pre tabindex="0"><code>$ helm fetch oci://registry.drycc.cc/charts/controller --version 1.0.0 +Verification: &amp;{0xc4207ec870 sha256:026e766e918ff28d2a7041bc3d560d149ee7eb0cb84165c9d9d00a3045ff45c3 controller-v1.0.1.tgz} +</code></pre><h2 id="how-to-release-workflow">How to Release Workflow<a class="td-heading-self-link" href="#how-to-release-workflow" aria-label="Heading self-link"></a></h2> +<p>Drycc Workflow integrates multiple component releases together with a <a href="https://github.com/kubernetes/helm">Kubernetes Helm</a> chart +deliverable. This section leads a maintainer through creating a Workflow release.</p> +<h3 id="step-1-set-environment-variables">Step 1: Set Environment Variables<a class="td-heading-self-link" href="#step-1-set-environment-variables" aria-label="Heading self-link"></a></h3> +<p>Export two environment variables that will be used in later steps:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#204a87">export</span> <span style="color:#000">WORKFLOW_RELEASE</span><span style="color:#ce5c00;font-weight:bold">=</span>v2.17.0 <span style="color:#000">WORKFLOW_PREV_RELEASE</span><span style="color:#ce5c00;font-weight:bold">=</span>v2.16.0 <span style="color:#8f5902;font-style:italic"># for example</span> +</span></span></code></pre></div><h3 id="step-2-tag-supporting-repositories">Step 2: Tag Supporting Repositories<a class="td-heading-self-link" href="#step-2-tag-supporting-repositories" aria-label="Heading self-link"></a></h3> +<p>Some Workflow components not in the Helm chart must also be tagged in sync with the release. +Follow the <a href="/docs/roadmap/releases/#how-to-release-a-component">component release process</a> above and ensure that +these components are tagged:</p> +<ul> +<li><a href="https://github.com/drycc/workflow-cli">drycc/workflow-cli</a></li> +<li><a href="https://github.com/drycc/workflow-e2e">drycc/workflow-e2e</a></li> +</ul> +<p>The version number for <a href="https://github.com/drycc/workflow-cli">drycc/workflow-cli</a> should always match the overall Workflow version +number.</p> +<h3 id="step-3-create-helm-chart">Step 3: Create Helm Chart<a class="td-heading-self-link" href="#step-3-create-helm-chart" aria-label="Heading self-link"></a></h3> +<p>To create and stage a release candidate chart for Workflow, we will build the <a href="https://ci.drycc.info/job/workflow-chart-stage">workflow-chart-stage</a> job with the following parameters:</p> +<p><code>RELEASE_TAG=$WORKFLOW_RELEASE</code></p> +<p>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.</p> +<h3 id="step-4-manual-testing">Step 4: Manual Testing<a class="td-heading-self-link" href="#step-4-manual-testing" aria-label="Heading self-link"></a></h3> +<p>Now it&rsquo;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.</p> +<p>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.</p> +<p>When showstopper-level bugs are found, the process is as follows:</p> +<ol> +<li>Create a component PR that fixes the bug.</li> +<li>Once the PR passes and is reviewed, merge it and do a new +<a href="/docs/roadmap/releases/#how-to-release-a-component">component release</a></li> +<li>Trigger the same <code>workflow-chart-stage</code> job as mentioned in Step 3 to upload the newly-generated Workflow release candidate chart to staging.</li> +</ol> +<h3 id="step-5-release-the-chart">Step 5: Release the Chart<a class="td-heading-self-link" href="#step-5-release-the-chart" aria-label="Heading self-link"></a></h3> +<p>When testing has completed without uncovering any new showstopper bugs, kick off the <a href="https://ci.drycc.info/job/workflow-chart-release">workflow-chart-release</a> job with the following parameter:</p> +<p><code>RELEASE_TAG=$WORKFLOW_RELEASE</code></p> +<p>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.</p> +<h3 id="step-6-assemble-master-changelog">Step 6: Assemble Master Changelog<a class="td-heading-self-link" href="#step-6-assemble-master-changelog" aria-label="Heading self-link"></a></h3> +<p>Each component already updated its release notes on GitHub with CHANGELOG content. We&rsquo;ll now +generate the master changelog for the Workflow chart, consisting of all component and auxilliary repo changes.</p> +<p>We&rsquo;ll employ the <code>requirements.lock</code> file from the <code>WORKFLOW_PREV_RELEASE</code> chart, as well as a repo-to-chart-name <a href="https://github.com/drycc/dryccrel/blob/main/map.json">mapping file</a>, this time invoking <code>dryccrel changelog global</code> to get all component changes between +the chart versions existing in the <code>WORKFLOW_PREV_RELEASE</code> chart and the <em>most recent</em> releases existing in GitHub. +(Therefore, if there are any unreleased commits in a component repo, they will not appear here):</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm fetch --untar oci://registry.drycc.cc/charts/workflow --version <span style="color:#000">$WORKFLOW_PREV_RELEASE</span> +</span></span><span style="display:flex;"><span>dryccrel changelog global workflow/requirements.lock map.json &gt; changelog-<span style="color:#000">$WORKFLOW_RELEASE</span>.md +</span></span></code></pre></div><p>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.</p> +<h3 id="step-7-update-documentation">Step 7: Update Documentation<a class="td-heading-self-link" href="#step-7-update-documentation" aria-label="Heading self-link"></a></h3> +<p>Create a new pull request at <a href="https://github.com/drycc/workflow">drycc/workflow</a> that updates version references to the new release. +Use <code>git grep $WORKFLOW_PREV_RELEASE</code> to find any references, but be careful not to change +<code>CHANGELOG.md</code>.</p> +<p>Place the <code>$WORKFLOW_RELEASE</code> master changelog generated in Step 7 in the <code>changelogs</code> directory. +Make sure to add a header to the page to make it clear that this is for a Workflow release, e.g.:</p> +<pre tabindex="0"><code>## Workflow v2.16.0 -&gt; v2.17.0 +</code></pre><p>Once the PR has been reviewed and merged, do a <a href="/docs/roadmap/releases/#how-to-release-a-component">component release</a> of +<a href="https://github.com/drycc/workflow">drycc/workflow</a> itself. The version number for <a href="https://github.com/drycc/workflow">drycc/workflow</a> should always match the +overall Workflow version number.</p> +<h3 id="step-8-close-github-milestones">Step 8: Close GitHub Milestones<a class="td-heading-self-link" href="#step-8-close-github-milestones" aria-label="Heading self-link"></a></h3> +<p>Create a pull request at <a href="https://github.com/drycc/seed-repo">seed-repo</a> 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.</p> +<p>Milestones map to Drycc Workflow releases in <a href="https://github.com/drycc/workflow">drycc/workflow</a>. These milestones do not correspond +to individual component release tags.</p> +<h3 id="step-9-release-workflow-cli-stable">Step 9: Release Workflow CLI Stable<a class="td-heading-self-link" href="#step-9-release-workflow-cli-stable" aria-label="Heading self-link"></a></h3> +<p>Now that the <code>$WORKFLOW_RELEASE</code> version of Workflow CLI has been vetted, we can push <code>stable</code> artifacts based on this version.</p> +<p>Kick off <a href="https://ci.drycc.info/job/workflow-cli-build-stable/">https://ci.drycc.info/job/workflow-cli-build-stable/</a> with the <code>TAG</code> build parameter of <code>$WORKFLOW_RELEASE</code> +and then verify <code>stable</code> artifacts are available and appropriately updated after the job completes:</p> +<pre tabindex="0"><code>$ curl -sfL https://www.drycc.cc/install-cli.sh | bash - +$ ./drycc version +# (Should show $WORKFLOW_RELEASE) +</code></pre><h3 id="step-10-let-everyone-know">Step 10: Let Everyone Know<a class="td-heading-self-link" href="#step-10-let-everyone-know" aria-label="Heading self-link"></a></h3> +<p>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:</p> +<pre tabindex="0"><code>@here Drycc Workflow v2.17.0 is now live! +Master CHANGELOG: https://drycc.info/docs/workflow/changelogs/v2.17.0/ +</code></pre><p>You&rsquo;re done with the release. Nice job!</p> + + + + + + Docs: Users and SSH Keys + /docs/users/ssh-keys/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/users/ssh-keys/ + + + + <p>For <strong>Dockerfile</strong> and <strong>Buildpack</strong> based application deploys via <code>git push</code>, 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.</p> +<h2 id="generate-an-ssh-key">Generate an SSH Key<a class="td-heading-self-link" href="#generate-an-ssh-key" aria-label="Heading self-link"></a></h2> +<p>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 +<code>ssh-keygen</code>:</p> +<pre tabindex="0"><code>$ 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&#39;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) +</code></pre><h2 id="adding-and-removing-ssh-keys">Adding and Removing SSH Keys<a class="td-heading-self-link" href="#adding-and-removing-ssh-keys" aria-label="Heading self-link"></a></h2> +<p>By publishing the <strong>public</strong> half of your SSH key to Drycc Workflow the component responsible for receiving <code>git push</code> +will be able to authenticate the user and ensure that they have access to the destination application.</p> +<pre tabindex="0"><code>$ drycc keys:add ~/.ssh/id_drycc.pub +Uploading id_drycc.pub to drycc... done +</code></pre><p>You can always view the keys associated with your user as well:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Remove keys by their name:</p> +<pre tabindex="0"><code>$ drycc keys:remove admin@plinth-23437.local +Removing admin@plinth-23437.local SSH Key... don +</code></pre> + + + + + Docs: Troubleshooting Applications + /docs/troubleshooting/applications/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/troubleshooting/applications/ + + + + <h2 id="application-has-a-dockerfile-but-a-buildpack-deployment-occurs">Application has a Dockerfile, but a Buildpack Deployment Occurs<a class="td-heading-self-link" href="#application-has-a-dockerfile-but-a-buildpack-deployment-occurs" aria-label="Heading self-link"></a></h2> +<p>When you deploy an application to Workflow using <code>git push drycc master</code> and the <a href="/docs/understanding-workflow/components/#builder">Builder</a> +attempts to deploy using the Buildpack workflow, check the following steps:</p> +<ol> +<li>Are you deploying the correct project?</li> +<li>Are you pushing the correct git branch (<code>git push drycc &lt;branch&gt;</code>)?</li> +<li>Is the <code>Dockerfile</code> in the project&rsquo;s root directory?</li> +<li>Have you committed the <code>Dockerfile</code> to the project?</li> +</ol> +<h2 id="application-was-deployed-but-is-failing-to-start">Application was Deployed, but is Failing to Start<a class="td-heading-self-link" href="#application-was-deployed-but-is-failing-to-start" aria-label="Heading self-link"></a></h2> +<p>If you deployed your application but it is failing to start, you can use <code>drycc logs</code> 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 +<a href="/docs/troubleshooting/kubectl/">troubleshooting using kubectl</a>. You can inspect the application&rsquo;s current +state by examining the pod deployed in the application&rsquo;s namespace. To do that, run</p> +<pre><code>$ kubectl --namespace=myapp get pods +NAME READY STATUS RESTARTS AGE +myapp-web-1585713350-3brbo 0/1 CrashLoopBackOff 2 43s +</code></pre> +<p>We can then describe the pod and determine why it is failing to boot:</p> +<pre><code>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 +</code></pre> +<p>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.</p> +<p>See <a href="/docs/applications/managing-app-configuration/#custom-health-checks">Custom Health Checks</a> for more information on how to customize the application&rsquo;s +health checks to better suit the application&rsquo;s needs.</p> + + + + + + Docs: Configuring Object Storage + /docs/installing-workflow/configuring-object-storage/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/installing-workflow/configuring-object-storage/ + + + + <p>Drycc Workflow ships with <a href="/docs/understanding-workflow/components/#object-storage">Storage</a> by default, which provides in-cluster.</p> +<h2 id="configuring-off-cluster-object-storage">Configuring off-cluster Object Storage<a class="td-heading-self-link" href="#configuring-off-cluster-object-storage" aria-label="Heading self-link"></a></h2> +<p>Every component that relies on object storage uses two inputs for configuration:</p> +<ol> +<li>You must use object storage services that are compatible with S3 API</li> +<li>Access credentials stored as a Kubernetes secret named <code>storage-creds</code></li> +</ol> +<p>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, <a href="https://azure.microsoft.com/en-us/services/storage/blobs/">Azure Blob Storage</a> and OpenStack Swift Storage.</p> +<h3 id="step-1-create-storage-buckets">Step 1: Create storage buckets<a class="td-heading-self-link" href="#step-1-create-storage-buckets" aria-label="Heading self-link"></a></h3> +<p>Create storage buckets for each of the Workflow subsystems: <code>builder</code>, <code>registry</code>, and <code>database</code>.</p> +<p>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 <a href="https://forums.aws.amazon.com/thread.jspa?threadID=105357">ssl certificate validation issue with S3</a>.</p> +<p>If you provide credentials with sufficient access to the underlying storage, Workflow components will create the buckets if they do not exist.</p> +<h3 id="step-2-generate-storage-credentials">Step 2: Generate storage credentials<a class="td-heading-self-link" href="#step-2-generate-storage-credentials" aria-label="Heading self-link"></a></h3> +<p>If applicable, generate credentials that have create and write access to the storage buckets created in Step 1.</p> +<p>If you are using AWS S3 and your Kubernetes nodes are configured with appropriate <a href="http://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html">IAM</a> 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!</p> +<h3 id="step-3-configure-workflow-chart">Step 3: Configure Workflow Chart<a class="td-heading-self-link" href="#step-3-configure-workflow-chart" aria-label="Heading self-link"></a></h3> +<p>Operators should configure object storage by editing the Helm values file before running <code>helm install</code>. To do so:</p> +<ul> +<li>Fetch the Helm values by running <code>helm inspect values oci://registry.drycc.cc/charts/workflow &gt; values.yaml</code></li> +<li>Update the <code>global/storage</code> parameter to reference the platform you are using, e.g. <code>s3</code>, <code>azure</code>, <code>gcs</code>, or <code>swift</code></li> +<li>Find the corresponding section for your storage type and provide appropriate values including region, bucket names, and access credentials.</li> +<li>Save your changes.</li> +</ul> +<p>!!! note +All values will be automatically (base64) encoded <em>except</em> the <code>key_json</code> values under <code>gcs</code>/<code>gcr</code>. These must be base64-encoded. This is to support cleanly passing said encoded text via <code>helm --set</code> cli functionality rather than attempting to pass the raw JSON data. For example:</p> +<pre><code> $ helm install drycc oci://registry.drycc.cc/charts/workflow \ + --namespace drycc \ + --set global.platformDomain=youdomain.com + --set global.storage=gcs,gcs.key_json=&quot;$(cat /path/to/gcs_creds.json | base64 -w 0)&quot; +</code></pre> +<p>You are now ready to run <code>helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml</code> using your desired object storage.</p> + + + + + + Docs: Using Docker Images + /docs/applications/using-container-images/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/using-container-images/ + + + + <p>Drycc supports deploying applications via an existing <a href="https://docs.docker.com/introduction/understanding-docker/">Docker Image</a>. +This is useful for integrating Drycc into Docker-based CI/CD pipelines.</p> +<h2 id="prepare-an-application">Prepare an Application<a class="td-heading-self-link" href="#prepare-an-application" aria-label="Heading self-link"></a></h2> +<p>Start by cloning an example application:</p> +<pre><code>$ git clone https://github.com/drycc/example-dockerfile-http.git +$ cd example-dockerfile-http +</code></pre> +<p>Next use your local <code>docker</code> client to build the image and push +it to <a href="https://registry.hub.docker.com/">DockerHub</a>.</p> +<pre><code>$ docker build -t &lt;username&gt;/example-dockerfile-http . +$ docker push &lt;username&gt;/example-dockerfile-http +</code></pre> +<h3 id="docker-image-requirements">Docker Image Requirements<a class="td-heading-self-link" href="#docker-image-requirements" aria-label="Heading self-link"></a></h3> +<p>In order to deploy Docker images, they must conform to the following requirements:</p> +<ul> +<li>The Dockerfile must use the <code>EXPOSE</code> directive to expose exactly one port.</li> +<li>That port must be listening for an HTTP connection.</li> +<li>The Dockerfile must use the <code>CMD</code> directive to define the default process that will run within the container.</li> +<li>The Docker image must contain <a href="https://www.gnu.org/software/bash/">bash</a> to run processes.</li> +</ul> +<p>!!! note +Note that if you are using a private registry of any kind (<code>gcr</code> or other) the application environment must include a <code>$PORT</code> config variable that matches the <code>EXPOSE</code>&rsquo;d port, example: <code>drycc config:set PORT=5000</code>. See <a href="/docs/installing-workflow/configuring-registry/#configuring-off-cluster-private-registry">Configuring Registry</a> for more info.</p> +<h2 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h2> +<p>Use <code>drycc create</code> to create an application on the <a href="/docs/understanding-workflow/components/#controller">controller</a>.</p> +<pre><code>$ mkdir -p /tmp/example-dockerfile-http &amp;&amp; cd /tmp/example-dockerfile-http +$ drycc create example-dockerfile-http --no-remote +Creating application... done, created example-dockerfile-http +</code></pre> +<p>!!! note +For all commands except for <code>drycc create</code>, the <code>drycc</code> client uses the name of the current directory +as the app name if you don&rsquo;t specify it explicitly with <code>--app</code>.</p> +<h2 id="deploy-the-application">Deploy the Application<a class="td-heading-self-link" href="#deploy-the-application" aria-label="Heading self-link"></a></h2> +<p>Use <code>drycc pull</code> to deploy your application from <a href="https://registry.hub.docker.com/">DockerHub</a> or +a public registry.</p> +<pre><code>$ drycc pull &lt;username&gt;/example-dockerfile-http:latest +Creating build... done, v2 + +$ curl -s http://example-dockerfile-http.local3.dryccapp.com +Powered by Drycc +</code></pre> +<p>Because you are deploying a Docker image, the <code>web</code> process type is automatically scaled to 1 on first deploy.</p> +<p>Use <code>drycc scale web=3</code> to increase <code>web</code> processes to 3, for example. Scaling a +process type directly changes the number of <a href="../reference-guide/terms.md#container">Containers</a> +running that process.</p> +<h2 id="private-registry">Private Registry<a class="td-heading-self-link" href="#private-registry" aria-label="Heading self-link"></a></h2> +<p>To deploy Docker images from a private registry or from a private repository, use <code>drycc registry</code> +to attach credentials to your application. These credentials are the same as you&rsquo;d use when running +<code>docker login</code> at your private registry.</p> +<p>To deploy private Docker images, take the following steps:</p> +<ul> +<li>Gather the username and password for the registry, such as a <a href="https://docs.quay.io/glossary/robot-accounts.html">Quay.io Robot Account</a> or a <a href="https://cloud.google.com/container-registry/docs/auth#using_a_json_key_file">GCR.io Long Lived Token</a></li> +<li>Run <code>drycc registry:set username=&lt;the-user&gt; password=&lt;secret&gt; -a &lt;application-name&gt;</code></li> +<li>Now perform <code>drycc pull</code> as normal, against an image in the private registry</li> +</ul> +<p>When using a <a href="https://cloud.google.com/container-registry/docs/auth#using_a_json_key_file">GCR.io Long Lived Token</a>, the JSON blob will have to be compacted first using a +tool like <a href="https://stedolan.github.io/jq/">jq</a> and then used in the password field in <code>drycc registry:set</code>. For the username, use +<code>_json_key</code>. For example:</p> +<pre tabindex="0"><code>drycc registry:set username=_json_key password=&#34;$(cat google_cloud_cred.json | jq -c .)&#34; +</code></pre><p>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 <code>port</code> information can no longer be discovered. Instead the application <code>port</code> information can be set via +<code>drycc config:set PORT=80</code> prior to setting the registry information.</p> +<p>!!! note +Currently <a href="https://gcr.io">GCR.io</a> and <a href="https://aws.amazon.com/ecr/">ECR</a> in short lived auth token mode are not supported.</p> + + + + + + Docs: Controller API v2.1 + /docs/reference-guide/controller-api-v2-1/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/reference-guide/controller-api-v2-1/ + + + + <h2 id="whats-new">What&rsquo;s New<a class="td-heading-self-link" href="#whats-new" aria-label="Heading self-link"></a></h2> +<p><strong>New!</strong> <code>healthcheck</code> field in configuration, deprecates the <code>HEALTHCHECK_*</code> environment variables.</p> +<p><strong>New!</strong> Unsetting a configuration variable that does not exist will return a 422.</p> +<p><strong>New!</strong> Creating an identical sequential release returns a 409 rather than create a no-op release.</p> +<h2 id="authentication">Authentication<a class="td-heading-self-link" href="#authentication" aria-label="Heading self-link"></a></h2> +<h3 id="register-a-new-user">Register a New User<a class="td-heading-self-link" href="#register-a-new-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/register/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{ + &#34;username&#34;: &#34;test&#34;, + &#34;password&#34;: &#34;opensesame&#34;, + &#34;email&#34;: &#34;test@example.com&#34; +} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] +} +</code></pre><h3 id="log-in">Log in<a class="td-heading-self-link" href="#log-in" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/login/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{&#34;username&#34;: &#34;test&#34;, &#34;password&#34;: &#34;opensesame&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="cancel-account">Cancel Account<a class="td-heading-self-link" href="#cancel-account" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/auth/cancel/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="regenerate-token">Regenerate Token<a class="td-heading-self-link" href="#regenerate-token" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command could require administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/tokens/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;username&#34; : &#34;test&#34; + &#34;all&#34; : &#34;true&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="change-password">Change Password<a class="td-heading-self-link" href="#change-password" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/passwd/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;password&#34;: &#34;foo&#34;, + &#34;new_password&#34;: &#34;bar&#34; +} +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;username&#34;: &#34;testuser&#34;} +</code></pre><blockquote> +<p><strong>note</strong></p> +<p>Using the <code>username</code> parameter requires administrative privileges and makes the <code>password</code> parameter optional.</p> +</blockquote> +<p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="applications">Applications<a class="td-heading-self-link" href="#applications" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-applications">List all Applications<a class="td-heading-self-link" href="#list-all-applications" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;id&#34;: &#34;example-go&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="destroy-an-application">Destroy an Application<a class="td-heading-self-link" href="#destroy-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="list-application-details">List Application Details<a class="td-heading-self-link" href="#list-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="update-application-details">Update Application Details<a class="td-heading-self-link" href="#update-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{ + &#34;owner&#34;: &#34;test&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 1.8.0 +Content-Type: application/json +</code></pre><h3 id="retrieve-application-logs">Retrieve Application Logs<a class="td-heading-self-link" href="#retrieve-application-logs" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/logs/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional URL Query Parameters:</p> +<pre tabindex="0"><code>?log_lines= +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: text/plain + +&#34;16:51:14 drycc[api]: test created initial release\n&#34; +</code></pre><h3 id="run-one-off-commands">Run one-off Commands<a class="td-heading-self-link" href="#run-one-off-commands" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>POST /v2/apps/example-go/run/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;command&#34;: &#34;echo hi&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;exit_code&#34;: 0, &#34;output&#34;: &#34;hi\n&#34;} +</code></pre><h2 id="certificates">Certificates<a class="td-heading-self-link" href="#certificates" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-certificates">List all Certificates<a class="td-heading-self-link" href="#list-all-certificates" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; + } + ] +} +</code></pre><h3 id="get-certificate-details">Get Certificate Details<a class="td-heading-self-link" href="#get-certificate-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="create-certificate">Create Certificate<a class="td-heading-self-link" href="#create-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{ + &#34;name&#34;: &#34;foo&#34; + &#34;certificate&#34;: &#34;-----BEGIN CERTIFICATE-----&#34;, + &#34;key&#34;: &#34;-----BEGIN RSA PRIVATE KEY-----&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="destroy-a-certificate">Destroy a Certificate<a class="td-heading-self-link" href="#destroy-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="attach-a-domain-to-a-certificate">Attach a Domain to a Certificate<a class="td-heading-self-link" href="#attach-a-domain-to-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/foo/domain/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;domain&#34;: &#34;test.com&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="remove-a-domain-from-a-certificate">Remove a Domain from a Certificate<a class="td-heading-self-link" href="#remove-a-domain-from-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="pods">Pods<a class="td-heading-self-link" href="#pods" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-pods">List all Pods<a class="td-heading-self-link" href="#list-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="list-all-pods-by-type">List all Pods by Type<a class="td-heading-self-link" href="#list-all-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/web/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="restart-all-pods">Restart All Pods<a class="td-heading-self-link" href="#restart-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type">Restart Pods by Type<a class="td-heading-self-link" href="#restart-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type-and-name">Restart Pods by Type and Name<a class="td-heading-self-link" href="#restart-pods-by-type-and-name" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="scale-pods">Scale Pods<a class="td-heading-self-link" href="#scale-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/scale/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;web&#34;: 3} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="configuration">Configuration<a class="td-heading-self-link" href="#configuration" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-configuration">List Application Configuration<a class="td-heading-self-link" href="#list-application-configuration" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="create-new-config">Create new Config<a class="td-heading-self-link" href="#create-new-config" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: &#34;world&#34;, &#34;PLATFORM&#34;: &#34;drycc&#34;}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v3&#34;, + &#34;HELLO&#34;: &#34;world&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="unset-config-variable">Unset Config Variable<a class="td-heading-self-link" href="#unset-config-variable" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: null}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v4&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="domains">Domains<a class="td-heading-self-link" href="#domains" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-domains">List Application Domains<a class="td-heading-self-link" href="#list-application-domains" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; + } + ] +} +</code></pre><h3 id="add-domain">Add Domain<a class="td-heading-self-link" href="#add-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#39;domain&#39;: &#39;example.example.com&#39;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; +} +</code></pre><h3 id="remove-domain">Remove Domain<a class="td-heading-self-link" href="#remove-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="builds">Builds<a class="td-heading-self-link" href="#builds" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-builds">List Application Builds<a class="td-heading-self-link" href="#list-application-builds" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\&#34;/runner/init\&#34;] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db&#34;, + &#34;image&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: { + &#34;web&#34;: &#34;example-go&#34; + }, + &#34;sha&#34;: &#34;060da68f&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-application-build">Create Application Build<a class="td-heading-self-link" href="#create-application-build" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;image&#34;: &#34;drycc/example-go:latest&#34;} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;procfile&#34;: { + &#34;web&#34;: &#34;./cmd&#34; + } +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;&#34;, + &#34;image&#34;: &#34;drycc/example-go:latest&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: {}, + &#34;sha&#34;: &#34;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-releases">List Application Releases<a class="td-heading-self-link" href="#list-application-releases" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 3, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;202d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;ed637ceb-5d32-44bd-9406-d326a777a513&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test changed nothing&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 3 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;202d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test deployed 060da68&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 2 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 + } + ] +} +</code></pre><h3 id="list-release-details">List Release Details<a class="td-heading-self-link" href="#list-release-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/v2/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 +} +</code></pre><h3 id="rollback-release">Rollback Release<a class="td-heading-self-link" href="#rollback-release" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;version&#34;: 1} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;version&#34;: 5} +</code></pre><h2 id="keys">Keys<a class="td-heading-self-link" href="#keys" aria-label="Heading self-link"></a></h2> +<h3 id="list-keys">List Keys<a class="td-heading-self-link" href="#list-keys" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;test@example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="add-key-to-user">Add Key to User<a class="td-heading-self-link" href="#add-key-to-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;id&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example&#34;, + &#34;owner&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="remove-key-from-user">Remove Key from User<a class="td-heading-self-link" href="#remove-key-from-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/keys/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="permissions">Permissions<a class="td-heading-self-link" href="#permissions" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-permissions">List Application Permissions<a class="td-heading-self-link" href="#list-application-permissions" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This does not include the app owner.</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;users&#34;: [ + &#34;test&#34;, + &#34;foo&#34; + ] +} +</code></pre><h3 id="create-application-permission">Create Application Permission<a class="td-heading-self-link" href="#create-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="remove-application-permission">Remove Application Permission<a class="td-heading-self-link" href="#remove-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="list-administrators">List Administrators<a class="td-heading-self-link" href="#list-administrators" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/admin/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 2, + &#34;next&#34;: null + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;username&#34;: &#34;test&#34;, + &#34;is_superuser&#34;: true + }, + { + &#34;username&#34;: &#34;foo&#34;, + &#34;is_superuser&#34;: true + } + ] +} +</code></pre><h3 id="grant-user-administrative-privileges">Grant User Administrative Privileges<a class="td-heading-self-link" href="#grant-user-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/admin/perms HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="remove-users-administrative-privileges">Remove User&rsquo;s Administrative Privileges<a class="td-heading-self-link" href="#remove-users-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/admin/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="users">Users<a class="td-heading-self-link" href="#users" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-users">List all users<a class="td-heading-self-link" href="#list-all-users" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/users HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] + } + ] +} +</code></pre> + + + + + Docs: Deploy Your First App + /docs/quickstart/deploy-an-app/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/quickstart/deploy-an-app/ + + + + <h2 id="determine-your-host-and-hostname-values">Determine Your Host and Hostname Values<a class="td-heading-self-link" href="#determine-your-host-and-hostname-values" aria-label="Heading self-link"></a></h2> +<p>Drycc workflow requires a wildcard DNS record to dynamically map app names to the router.</p> +<p>User should already have DNS set up pointing to their known host. The <code>$hostname</code> value can be calculated by prepending <code>drycc.</code> to the value set in <code>global.platformDomain</code>.</p> +<h2 id="login-to-workflow">Login to Workflow<a class="td-heading-self-link" href="#login-to-workflow" aria-label="Heading self-link"></a></h2> +<p>Workflow use the passport component to create and authorize users. +If you already have an account, use <code>drycc login</code> to authenticate against the Drycc Workflow API.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Or you can login with username and password</p> +<pre tabindex="0"><code>$ drycc login http://drycc.example.com --username=demo --password=demo +Configuration file written to /root/.drycc/client.json +</code></pre><h2 id="deploy-an-application">Deploy an Application<a class="td-heading-self-link" href="#deploy-an-application" aria-label="Heading self-link"></a></h2> +<p>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&rsquo;t have to wrestle with checking out code.</p> +<p>Run <code>drycc create</code> 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.</p> +<pre tabindex="0"><code>$ 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` +</code></pre><p>Our application has been created and named <code>proper-barbecue</code>. As with the +<code>drycc</code> hostname, any HTTP traffic to <code>proper-barbecue</code> will be automatically +routed to your application pods by the edge router.</p> +<p>Let&rsquo;s use the CLI to tell the platform to deploy an application and then use curl to send a request to the app:</p> +<pre tabindex="0"><code>$ drycc pull drycc/example-go -a proper-barbecue +Creating build... done +$ curl http://proper-barbecue.$hostname +Powered by Drycc +</code></pre><p>!!! note +If you see a 404 error, make sure you specified your application name with <code>-a &lt;appname&gt;</code>!</p> +<p>Workflow&rsquo;s edge router knows all about application names and automatically +sends traffic to the right application. The router sends traffic for +<code>proper-barbecue.104.197.125.75.nip.io</code> to your app, just like +<code>drycc.104.197.125.75.nip.io</code> was sent to the Workflow API service.</p> +<h2 id="change-application-configuration">Change Application Configuration<a class="td-heading-self-link" href="#change-application-configuration" aria-label="Heading self-link"></a></h2> +<p>Next, let&rsquo;s change some configuration using the CLI. Our example app is built +to read configuration from the environment. By using <code>drycc config:set</code> we can +change how the application behaves:</p> +<pre tabindex="0"><code>$ drycc config:set POWERED_BY=&#34;Container Images + Kubernetes&#34; -a proper-barbecue +Creating config... done + +UUID OWNER NAME VALUE +04bb6e45-9221-4843-a1f9-acc7fded3b06 dev POWERED_BY Container Images + Kubernetes +</code></pre><p>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!</p> +<p>Validate that our configuration change has worked:</p> +<pre tabindex="0"><code>$ curl http://proper-barbecue.104.197.125.75.nip.io +Powered by Container Images + Kubernetes +</code></pre><h2 id="scale-your-application">Scale Your Application<a class="td-heading-self-link" href="#scale-your-application" aria-label="Heading self-link"></a></h2> +<p>Last, let&rsquo;s scale our application by adding more application processes. Using the CLI you can easily add and remove +additional processes to service requests:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Congratulations! You have deployed, configured, and scaled your first application using Drycc Workflow.</p> +<h2 id="going-further">Going Further<a class="td-heading-self-link" href="#going-further" aria-label="Heading self-link"></a></h2> +<p>There is a lot more you can do with Drycc Workflow, play around with the CLI:</p> +<p>!!! 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 <a href="/docs/users/ssh-keys/">Users and SSH Keys</a> and <a href="/docs/troubleshooting/">Troubleshooting Workflow</a>.</p> +<ul> +<li>Roll back to a previous release with <code>drycc rollback -a proper-barbecue</code></li> +<li>See application logs with <code>drycc logs -a proper-barbecue</code></li> +<li>Try one of our other example applications like: +<ul> +<li><a href="https://github.com/drycc/ruby-getting-started">drycc/ruby-getting-started</a></li> +<li><a href="https://github.com/drycc/python-getting-started">drycc/python-getting-started</a></li> +<li><a href="https://github.com/drycc/php-getting-started">drycc/php-getting-started</a></li> +</ul> +</li> +<li>Read about using application <a href="/docs/applications/using-buildpacks/">Buildpacks</a> or <a href="/docs/applications/using-dockerfiles/">Dockerfiles</a></li> +<li>Join our <a href="https://drycc.slack.com/">#community slack channel</a> and meet the team!</li> +</ul> + + + + + + Docs: Platform Logging + /docs/managing-workflow/platform-logging/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/platform-logging/ + + + + <p>The logging platform is made up of 2 components - <a href="https://github.com/drycc/fluentbit">Fluentbit</a> and <a href="https://github.com/drycc/logger">Logger</a>.</p> +<p><a href="https://github.com/drycc/fluentbit">Fluentbit</a> runs on every worker node of the cluster and is deployed as a <a href="http://kubernetes.io/v1.1/docs/admin/daemons.html">Daemon Set</a>. 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 <a href="https://github.com/drycc/fluentbit/tree/main/plugin">custom fluentbit plugin</a> we determine where the message originated.</p> +<p>If the message was from the <a href="https://github.com/drycc/controller">Workflow Controller</a> or from an application deployed via workflow we send it to the logs topic on the local <a href="http://redis.io">Redis Stream</a> instance.</p> +<p>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 <code>drycc logs</code> command we make an HTTP request from Controller to Logger which then fetches the appropriate data from Redis.</p> +<h2 id="configuring-off-cluster-redis">Configuring Off Cluster Redis<a class="td-heading-self-link" href="#configuring-off-cluster-redis" aria-label="Heading self-link"></a></h2> +<p>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:</p> +<ul> +<li>db = &ldquo;0&rdquo;</li> +<li>host = &ldquo;my.host.redis&rdquo;</li> +<li>port = &ldquo;6379&rdquo;</li> +<li>password = &quot;&quot;</li> +</ul> +<p>These can be changed by running <code>helm inspect values drycc/workflow &gt; values.yaml</code> before using +<code>helm install</code> to complete the installation. To customize the redis credentials, edit <code>values.yaml</code> +and modify the <code>redis</code> section of the file to tune these settings.</p> +<h2 id="debugging-logger">Debugging Logger<a class="td-heading-self-link" href="#debugging-logger" aria-label="Heading self-link"></a></h2> +<p>If the <code>drycc logs</code> command encounters an error it will return the following message:</p> +<pre tabindex="0"><code>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 &lt;logger pod&gt; +3) Making sure that the container logs were mounted properly into the fluentbit pod: kubectl --namespace=drycc exec &lt;fluentbit pod&gt; ls /var/log/containers +</code></pre><h2 id="architecture-diagram">Architecture Diagram<a class="td-heading-self-link" href="#architecture-diagram" aria-label="Heading self-link"></a></h2> +<pre tabindex="0"><code> ┌────────┐ + │ Router │ ┌────────┐ ┌─────┐ + └────────┘ │ Logger │◀───▶│Redis│ + │ └────────┘ └─────┘ + Log file ▲ + │ │ + ▼ │ +┌────────┐ ┌─────────┐ logs/metrics ┌──────────────┐ +│App Logs│──Log File──▶│Fluentbit│───────topics─────▶│ Redis Stream │ +└────────┘ └─────────┘ └──────────────┘ + +</code></pre><h2 id="default-configuration">Default Configuration<a class="td-heading-self-link" href="#default-configuration" aria-label="Heading self-link"></a></h2> +<p>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 <a href="https://github.com/drycc/fluentbit/blob/main/charts/fluentbit/values.yaml">values.yaml</a> for specific configurations.</p> + + + + + + Docs: Testing Drycc + /docs/contribution-guidelines/testing/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/testing/ + + + + <p>Each Drycc component includes its own suite of style checks, <a href="http://en.wikipedia.org/wiki/Unit_testing">unit tests</a>, and black-box type <a href="http://en.wikipedia.org/wiki/Functional_testing">functional tests</a>.</p> +<p><a href="http://en.wikipedia.org/wiki/Integration_testing">Integration tests</a> verify the behavior of the Drycc components together as a system and are provided separately by the <a href="https://github.com/drycc/workflow-e2e">drycc/workflow-e2e</a> project.</p> +<p>GitHub pull requests for all Drycc components are tested automatically by the <a href="https://travis-ci.org/drycc">Travis CI</a> <a href="http://en.wikipedia.org/wiki/Continuous_integration">continuous integration</a> system. Contributors should run the same tests locally before proposing any changes to the Drycc codebase.</p> +<h2 id="set-up-the-environment">Set Up the Environment<a class="td-heading-self-link" href="#set-up-the-environment" aria-label="Heading self-link"></a></h2> +<p>Successfully executing the unit and functional tests for any Drycc component requires that the <a href="/docs/contribution-guidelines/development-environment/">Development Environment</a> is set up first.</p> +<h2 id="run-the-tests">Run the Tests<a class="td-heading-self-link" href="#run-the-tests" aria-label="Heading self-link"></a></h2> +<p>The style checks, unit tests, and functional tests for each component can all be executed via make targets:</p> +<p>To execute style checks:</p> +<pre tabindex="0"><code>$ make test-style +</code></pre><p>To execute unit tests:</p> +<pre tabindex="0"><code>$ make test-unit +</code></pre><p>To execute functional tests:</p> +<pre tabindex="0"><code>$ make test-functional +</code></pre><p>To execute style checks, unit tests, and functional tests all in one shot:</p> +<pre tabindex="0"><code>$ make test +</code></pre><p>To execute integration tests, refer to <a href="https://github.com/drycc/workflow-e2e">drycc/workflow-e2e</a> documentation.</p> + + + + + + Docs: Configuring Postgres + /docs/installing-workflow/configuring-postgres/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/installing-workflow/configuring-postgres/ + + + + <h1 id="configuring-postgres">Configuring Postgres<a class="td-heading-self-link" href="#configuring-postgres" aria-label="Heading self-link"></a></h1> +<p>By default, Drycc Workflow ships with the <a href="/docs/understanding-workflow/components/#database">database</a> component, which provides an in-cluster PostgreSQL database backed up to in-cluster or off-cluster <a href="/docs/installing-workflow/configuring-object-storage/">object storage</a>. Currently, for object storage, which is utilized by <em>several</em> 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.</p> +<h2 id="provisioning-off-cluster-postgres">Provisioning off-cluster Postgres<a class="td-heading-self-link" href="#provisioning-off-cluster-postgres" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>Take note of the following:</p> +<ol> +<li>The hostname or public IP of your PostgreSQL RDBMS</li> +<li>The port on which your PostgreSQL RDBMS runs&ndash; typically 5432</li> +</ol> +<p>Within the off-cluster RDBMS, manually provision the following:</p> +<ol> +<li>A database user (take note of the username and password)</li> +<li>A database owned by that user (take note of its name)</li> +</ol> +<p>If you are able to log into the RDBMS as a superuser or a user with appropriate permissions, this process will <em>typically</em> look like this:</p> +<pre tabindex="0"><code>$ psql -h &lt;host&gt; -p &lt;port&gt; -d postgres -U &lt;&#34;postgres&#34; or your own username&gt; +&gt; create user &lt;drycc username; typically &#34;drycc&#34;&gt; with password &#39;&lt;password&gt;&#39;; +&gt; create database &lt;database name; typically &#34;drycc&#34;&gt; with owner &lt;drycc username&gt;; +&gt; \q +</code></pre><h2 id="configuring-workflow">Configuring Workflow<a class="td-heading-self-link" href="#configuring-workflow" aria-label="Heading self-link"></a></h2> +<p>The Helm chart for Drycc Workflow can be easily configured to connect the Workflow controller component to an off-cluster PostgreSQL database.</p> +<ul> +<li><strong>Step 1:</strong> If you haven&rsquo;t already fetched the values, do so with <code>helm inspect values drycc/workflow &gt; values.yaml</code></li> +<li><strong>Step 2:</strong> Update database connection details by modifying <code>values.yaml</code>: +<ul> +<li>Update the <code>databaseLocation</code> parameter to <code>off-cluster</code>.</li> +<li>Update the values in the <code>[database]</code> configuration section to properly reflect all connection details.</li> +<li>Update the values in the <code>[controller]</code> configuration section to properly reflect platformDomain details.</li> +<li>Save your changes.</li> +<li>Note: you do not need to (and must not) base64 encode any values, as the Helm chart will automatically handle encoding as necessary.</li> +</ul> +</li> +</ul> +<p>You are now ready to <code>helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml</code> <a href="/docs/installing-workflow/">as usual</a>.</p> + + + + + + Docs: Configuring Registry + /docs/installing-workflow/configuring-registry/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/installing-workflow/configuring-registry/ + + + + <p>Drycc Workflow ships with a <a href="/docs/understanding-workflow/components/#registry">registry</a> component by default, which provides an in-cluster Container registry backed by the platform-configured <a href="/docs/installing-workflow/configuring-object-storage/">object storage</a>. Operators might want to use an off-cluster registry for performance or security reasons.</p> +<h2 id="configuring-off-cluster-private-registry">Configuring Off-Cluster Private Registry<a class="td-heading-self-link" href="#configuring-off-cluster-private-registry" aria-label="Heading self-link"></a></h2> +<p>Every component that relies on a registry uses two inputs for configuration:</p> +<ol> +<li>Registry Location environment variable named <code>DRYCC_REGISTRY_LOCATION</code></li> +<li>Access credentials stored as a Kubernetes secret named <code>registry-secret</code></li> +</ol> +<p>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.</p> +<p>When using a private registry the container images are no longer pulled by Drycc Workflow Controller but rather are managed by <a href="https://kubernetes.io">Kubernetes</a>. This will increase security and overall speed, however the <code>port</code> information can no longer be discovered. Instead the <code>port</code> information can be set via <code>drycc config:set PORT=&lt;port&gt;</code> prior to deploying the application.</p> +<p>Drycc Workflow currently supports:</p> +<ol> +<li>off-cluster: Any provider which supports long-lived username/password authentication, such as <a href="https://docs.microsoft.com/en-us/azure/container-registry/">Azure Container Registry</a>, <a href="https://hub.docker.com/">Docker Hub</a>, <a href="https://quay.io/">quay.io</a>, or a self-hosted Container registry.</li> +</ol> +<h2 id="configuration">Configuration<a class="td-heading-self-link" href="#configuration" aria-label="Heading self-link"></a></h2> +<ol> +<li>If you haven&rsquo;t already fetched the values file, do so with <code>helm inspect values drycc/workflow &gt; values.yaml</code></li> +<li>Update registry location details by modifying the values file: +* Update the <code>registryLocation</code> parameter to reference the registry location you are using: <code>off-cluster</code>, <code>ecr</code>, <code>gcr</code> +* Update the values in the section which corresponds to your registry location type.</li> +</ol> +<p>You are now ready to <code>helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml</code> using your desired registry.</p> +<h2 id="examples">Examples<a class="td-heading-self-link" href="#examples" aria-label="Heading self-link"></a></h2> +<p>Here we show how the relevant parts of the fetched <code>values.yaml</code> file might look like after configuring for a particular off-cluster registry:</p> +<h3 id="azure-container-registryhttpsazuremicrosoftcomen-usservicescontainer-registry-acr"><a href="https://azure.microsoft.com/en-us/services/container-registry/">Azure Container Registry</a> (ACR)<a class="td-heading-self-link" href="#azure-container-registryhttpsazuremicrosoftcomen-usservicescontainer-registry-acr" aria-label="Heading self-link"></a></h3> +<p>After following the <a href="https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-azure-cli">docs</a> and creating a registry, e.g. <code>myregistry</code>, with its corresponding login server of <code>myregistry.azurecr.io</code>, the following values should be supplied:</p> +<pre tabindex="0"><code>global: +... + registryLocation: &#34;off-cluster&#34; +... +registry-token-refresher: +... + registry: + hostname: &#34;myregistry.azurecr.io&#34; + organization: &#34;myorg&#34; + username: &#34;myusername&#34; + password: &#34;mypassword&#34; +... +</code></pre><p><strong>Note:</strong> The mandatory organization field (here <code>myorg</code>) will be created as an ACR repository if it does not already exist.</p> +<h3 id="quayio">Quay.io<a class="td-heading-self-link" href="#quayio" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>global: +... + registryLocation: &#34;off-cluster&#34; +... +registry-token-refresher: +... + registry: + hostname: &#34;quay.io&#34; + organization: &#34;myorg&#34; + username: &#34;myusername&#34; + password: &#34;mypassword&#34; +... +</code></pre> + + + + + Docs: Controller API v2.2 + /docs/reference-guide/controller-api-v2-2/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/reference-guide/controller-api-v2-2/ + + + + <h2 id="whats-new">What&rsquo;s New<a class="td-heading-self-link" href="#whats-new" aria-label="Heading self-link"></a></h2> +<p><strong>New!</strong> <code>/v2/auth/whoami</code> endpoint</p> +<h2 id="authentication">Authentication<a class="td-heading-self-link" href="#authentication" aria-label="Heading self-link"></a></h2> +<h3 id="register-a-new-user">Register a New User<a class="td-heading-self-link" href="#register-a-new-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/register/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{ + &#34;username&#34;: &#34;test&#34;, + &#34;password&#34;: &#34;opensesame&#34;, + &#34;email&#34;: &#34;test@example.com&#34; +} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] +} +</code></pre><h3 id="log-in">Log in<a class="td-heading-self-link" href="#log-in" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/login/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{&#34;username&#34;: &#34;test&#34;, &#34;password&#34;: &#34;opensesame&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="cancel-account">Cancel Account<a class="td-heading-self-link" href="#cancel-account" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/auth/cancel/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="who-am-i">Who Am I<a class="td-heading-self-link" href="#who-am-i" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/auth/whoami/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] +} +</code></pre><h3 id="regenerate-token">Regenerate Token<a class="td-heading-self-link" href="#regenerate-token" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command could require administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/tokens/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;username&#34; : &#34;test&#34; + &#34;all&#34; : &#34;true&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="change-password">Change Password<a class="td-heading-self-link" href="#change-password" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/passwd/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;password&#34;: &#34;foo&#34;, + &#34;new_password&#34;: &#34;bar&#34; +} +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;username&#34;: &#34;testuser&#34;} +</code></pre><blockquote> +<p><strong>note</strong></p> +<p>Using the <code>username</code> parameter requires administrative privileges and makes the <code>password</code> parameter optional.</p> +</blockquote> +<p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h2 id="applications">Applications<a class="td-heading-self-link" href="#applications" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-applications">List all Applications<a class="td-heading-self-link" href="#list-all-applications" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;id&#34;: &#34;example-go&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="destroy-an-application">Destroy an Application<a class="td-heading-self-link" href="#destroy-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="list-application-details">List Application Details<a class="td-heading-self-link" href="#list-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="update-application-details">Update Application Details<a class="td-heading-self-link" href="#update-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{ + &#34;owner&#34;: &#34;test&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 1.8.0 +Content-Type: application/json +</code></pre><h3 id="retrieve-application-logs">Retrieve Application Logs<a class="td-heading-self-link" href="#retrieve-application-logs" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/logs/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional URL Query Parameters:</p> +<pre tabindex="0"><code>?log_lines= +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: text/plain + +&#34;16:51:14 drycc[api]: test created initial release\n&#34; +</code></pre><h3 id="run-one-off-commands">Run one-off Commands<a class="td-heading-self-link" href="#run-one-off-commands" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>POST /v2/apps/example-go/run/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;command&#34;: &#34;echo hi&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{&#34;exit_code&#34;: 0, &#34;output&#34;: &#34;hi\n&#34;} +</code></pre><h2 id="certificates">Certificates<a class="td-heading-self-link" href="#certificates" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-certificates">List all Certificates<a class="td-heading-self-link" href="#list-all-certificates" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; + } + ] +} +</code></pre><h3 id="get-certificate-details">Get Certificate Details<a class="td-heading-self-link" href="#get-certificate-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="create-certificate">Create Certificate<a class="td-heading-self-link" href="#create-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{ + &#34;name&#34;: &#34;foo&#34; + &#34;certificate&#34;: &#34;-----BEGIN CERTIFICATE-----&#34;, + &#34;key&#34;: &#34;-----BEGIN RSA PRIVATE KEY-----&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="destroy-a-certificate">Destroy a Certificate<a class="td-heading-self-link" href="#destroy-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="attach-a-domain-to-a-certificate">Attach a Domain to a Certificate<a class="td-heading-self-link" href="#attach-a-domain-to-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/foo/domain/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;domain&#34;: &#34;test.com&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="remove-a-domain-from-a-certificate">Remove a Domain from a Certificate<a class="td-heading-self-link" href="#remove-a-domain-from-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h2 id="pods">Pods<a class="td-heading-self-link" href="#pods" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-pods">List all Pods<a class="td-heading-self-link" href="#list-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="list-all-pods-by-type">List all Pods by Type<a class="td-heading-self-link" href="#list-all-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/web/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="restart-all-pods">Restart All Pods<a class="td-heading-self-link" href="#restart-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type">Restart Pods by Type<a class="td-heading-self-link" href="#restart-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type-and-name">Restart Pods by Type and Name<a class="td-heading-self-link" href="#restart-pods-by-type-and-name" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="scale-pods">Scale Pods<a class="td-heading-self-link" href="#scale-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/scale/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;web&#34;: 3} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h2 id="configuration">Configuration<a class="td-heading-self-link" href="#configuration" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-configuration">List Application Configuration<a class="td-heading-self-link" href="#list-application-configuration" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="create-new-config">Create new Config<a class="td-heading-self-link" href="#create-new-config" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: &#34;world&#34;, &#34;PLATFORM&#34;: &#34;drycc&#34;}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v3&#34;, + &#34;HELLO&#34;: &#34;world&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="unset-config-variable">Unset Config Variable<a class="td-heading-self-link" href="#unset-config-variable" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: null}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v4&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="domains">Domains<a class="td-heading-self-link" href="#domains" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-domains">List Application Domains<a class="td-heading-self-link" href="#list-application-domains" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; + } + ] +} +</code></pre><h3 id="add-domain">Add Domain<a class="td-heading-self-link" href="#add-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#39;domain&#39;: &#39;example.example.com&#39;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; +} +</code></pre><h3 id="remove-domain">Remove Domain<a class="td-heading-self-link" href="#remove-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h2 id="builds">Builds<a class="td-heading-self-link" href="#builds" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-builds">List Application Builds<a class="td-heading-self-link" href="#list-application-builds" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\&#34;/runner/init\&#34;] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db&#34;, + &#34;image&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: { + &#34;web&#34;: &#34;example-go&#34; + }, + &#34;sha&#34;: &#34;060da68f&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-application-build">Create Application Build<a class="td-heading-self-link" href="#create-application-build" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;image&#34;: &#34;drycc/example-go:latest&#34;} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;procfile&#34;: { + &#34;web&#34;: &#34;./cmd&#34; + } +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;&#34;, + &#34;image&#34;: &#34;drycc/example-go:latest&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: {}, + &#34;sha&#34;: &#34;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-releases">List Application Releases<a class="td-heading-self-link" href="#list-application-releases" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 3, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;202d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;ed637ceb-5d32-44bd-9406-d326a777a513&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test changed nothing&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 3 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;202d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test deployed 060da68&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 2 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 + } + ] +} +</code></pre><h3 id="list-release-details">List Release Details<a class="td-heading-self-link" href="#list-release-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/v2/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 +} +</code></pre><h3 id="rollback-release">Rollback Release<a class="td-heading-self-link" href="#rollback-release" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;version&#34;: 1} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{&#34;version&#34;: 5} +</code></pre><h2 id="keys">Keys<a class="td-heading-self-link" href="#keys" aria-label="Heading self-link"></a></h2> +<h3 id="list-keys">List Keys<a class="td-heading-self-link" href="#list-keys" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;test@example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="add-key-to-user">Add Key to User<a class="td-heading-self-link" href="#add-key-to-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;id&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example&#34;, + &#34;owner&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="remove-key-from-user">Remove Key from User<a class="td-heading-self-link" href="#remove-key-from-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/keys/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h2 id="permissions">Permissions<a class="td-heading-self-link" href="#permissions" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-permissions">List Application Permissions<a class="td-heading-self-link" href="#list-application-permissions" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This does not include the app owner.</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;users&#34;: [ + &#34;test&#34;, + &#34;foo&#34; + ] +} +</code></pre><h3 id="create-application-permission">Create Application Permission<a class="td-heading-self-link" href="#create-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="remove-application-permission">Remove Application Permission<a class="td-heading-self-link" href="#remove-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="list-administrators">List Administrators<a class="td-heading-self-link" href="#list-administrators" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/admin/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 2, + &#34;next&#34;: null + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;username&#34;: &#34;test&#34;, + &#34;is_superuser&#34;: true + }, + { + &#34;username&#34;: &#34;foo&#34;, + &#34;is_superuser&#34;: true + } + ] +} +</code></pre><h3 id="grant-user-administrative-privileges">Grant User Administrative Privileges<a class="td-heading-self-link" href="#grant-user-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/admin/perms HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="remove-users-administrative-privileges">Remove User&rsquo;s Administrative Privileges<a class="td-heading-self-link" href="#remove-users-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/admin/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h2 id="users">Users<a class="td-heading-self-link" href="#users" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-users">List all users<a class="td-heading-self-link" href="#list-all-users" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/users HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] + } + ] +} +</code></pre> + + + + + Docs: Managing Application Processes + /docs/applications/managing-app-processes/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/managing-app-processes/ + + + + <p>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.</p> +<p>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 <code>drycc scale &lt;ptype&gt;=&lt;n&gt;</code> to scale those +types accordingly.</p> +<h2 id="default-process-types">Default Process Types<a class="td-heading-self-link" href="#default-process-types" aria-label="Heading self-link"></a></h2> +<p>In the absence of a Procfile, a single, default process type is assumed for each application.</p> +<p>Applications built using <a href="/docs/applications/using-buildpacks/">Buildpacks</a> via <code>git push</code> implicitly receive a <code>web</code> process type, which starts +the application server. Rails 4, for example, has the following process type:</p> +<pre><code>web: bundle exec rails server -p $PORT +</code></pre> +<p>All applications utilizing <a href="/docs/applications/using-dockerfiles/">Dockerfiles</a> have an implied <code>web</code> process type, which runs the +Dockerfile&rsquo;s <code>CMD</code> directive unmodified:</p> +<pre><code>$ cat Dockerfile +FROM centos:latest +COPY . /app +WORKDIR /app +CMD python -m SimpleHTTPServer 5000 +EXPOSE 5000 +</code></pre> +<p>For the above Dockerfile-based application, the <code>web</code> process type would run the Container <code>CMD</code> of <code>python -m SimpleHTTPServer 5000</code>.</p> +<p>Applications utilizing <a href="/docs/applications/using-container-images/">remote Container images</a>, a <code>web</code> process type is also implied, and runs the <code>CMD</code> +specified in the Container image.</p> +<p>!!! note +The <code>web</code> 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.</p> +<h2 id="declaring-process-types">Declaring Process Types<a class="td-heading-self-link" href="#declaring-process-types" aria-label="Heading self-link"></a></h2> +<p>If you use <a href="/docs/applications/using-buildpacks/">Buildpack</a> or <a href="/docs/applications/using-dockerfiles/">Dockerfile</a> builds and want to override or specify additional process +types, simply include a file named <code>Procfile</code> in the root of your application&rsquo;s source tree.</p> +<p>The format of a <code>Procfile</code> is one process type per line, with each line containing the command to invoke:</p> +<pre><code>&lt;process type&gt;: &lt;command&gt; +</code></pre> +<p>The syntax is defined as:</p> +<ul> +<li><code>&lt;process type&gt;</code> – a lowercase alphanumeric string, is a name for your command, such as web, worker, urgentworker, clock, etc.</li> +<li><code>&lt;command&gt;</code> – a command line to launch the process, such as <code>rake jobs:work</code>.</li> +</ul> +<p>This example Procfile specifies two types, <code>web</code> and <code>sleeper</code>. The <code>web</code> process launches a web server on port 5000 and +a simple process which sleeps for 900 seconds and exits.</p> +<pre tabindex="0"><code>$ cat Procfile +web: bundle exec ruby web.rb -p ${PORT:-5000} +sleeper: sleep 900 +</code></pre><p>If you are using <a href="/docs/applications/using-container-images/">remote Container images</a>, you may define process types by either running <code>drycc pull</code> with a +<code>Procfile</code> in your working directory, or by passing a stringified Procfile to the <code>--procfile</code> CLI option.</p> +<p>For example, passing process types inline:</p> +<pre tabindex="0"><code>$ drycc pull drycc/example-go:latest --procfile=&#34;web: /app/bin/boot&#34; +</code></pre><p>Read a <code>Procfile</code> in another directory:</p> +<pre tabindex="0"><code>$ drycc pull drycc/example-go:latest --procfile=&#34;$(cat deploy/Procfile)&#34; +</code></pre><p>Or via a Procfile located in your current, working directory:</p> +<pre tabindex="0"><code>$ cat Procfile +web: /bin/boot +sleeper: echo &#34;sleeping&#34;; 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 +</code></pre><p>!!! note +Only process types of <code>web</code> will be scaled to 1 automatically. If you have additional process types +remember to scale the process counts after creation.</p> +<p>To remove a process type simply scale it to 0:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="scaling-processes">Scaling Processes<a class="td-heading-self-link" href="#scaling-processes" aria-label="Heading self-link"></a></h2> +<p>Applications deployed on Drycc Workflow scale out via the <a href="https://devcenter.heroku.com/articles/process-model">process model</a>. Use <code>drycc scale</code> to control the number of +<a href="../reference-guide/terms.md#container">containers</a> that power your app.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>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 <a href="/docs/applications/managing-app-processes/">Managing App Processes</a>.</p> +<p>In this example, we are scaling the process type <code>web</code> to 5 but leaving the process type <code>background</code> with one worker.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Scaling a process down, by reducing the process count, sends a <code>TERM</code> signal to the processes, followed by a <code>SIGKILL</code> +if they have not exited within 30 seconds. Depending on your application, scaling down may interrupt long-running HTTP +client connections.</p> +<p>For example, scaling from 5 processes to 3:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="autoscale">Autoscale<a class="td-heading-self-link" href="#autoscale" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>This feature is built on top of <a href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/">Horizontal Pod Autoscaling</a> in Kubernetes or <a href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/">HPA</a> for short.</p> +<p>!!! note +This is an alpha feature. It is recommended to be on the latest Kubernetes when using this feature.</p> +<pre tabindex="0"><code>$ drycc autoscale:set web --min=3 --max=8 --cpu-percent=75 +Applying autoscale settings for process type web on scenic-icehouse... done +</code></pre><p>And then review the scaling rule that was created for <code>web</code></p> +<pre tabindex="0"><code>$ drycc autoscale:list +PTYPE PERCENT MIN MAX +web 75 3 8 +</code></pre><p>Remove scaling rule</p> +<pre tabindex="0"><code>$ drycc autoscale:unset web +Removing autoscale for process type web on scenic-icehouse... done +</code></pre><p>For autoscaling to work CPU requests have to be specified on each application Pod (can be done via <code>drycc limits --cpu</code>). This allows the autoscale policies to do the <a href="https://github.com/kubernetes/community/blob/master/contributors/design-proposals/horizontal-pod-autoscaler.md#autoscaling-algorithm">appropriate calculations</a> and make decisions on when to scale up and down.</p> +<p>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 <a href="https://github.com/kubernetes/community/blob/master/contributors/design-proposals/horizontal-pod-autoscaler.md#autoscaling-algorithm">HPA algorithm page</a>.</p> +<h2 id="fetch-a-container-logs-of-the-application">Fetch a container logs of the application<a class="td-heading-self-link" href="#fetch-a-container-logs-of-the-application" aria-label="Heading self-link"></a></h2> +<p>List the containers:</p> +<pre tabindex="0"><code>$ 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) +</code></pre><p>fetch the container logs:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="get-a-container-info-of-the-application">Get a container info of the application<a class="td-heading-self-link" href="#get-a-container-info-of-the-application" aria-label="Heading self-link"></a></h2> +<p>List the containers:</p> +<pre tabindex="0"><code>$ 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: &#34;2024-05-24T07:14:39Z&#34; +Ready: true +Restart Count: 0 +</code></pre><h2 id="delete-a-container-of-the-application">delete a container of the application<a class="td-heading-self-link" href="#delete-a-container-of-the-application" aria-label="Heading self-link"></a></h2> +<p>Delete the containers. +Due to the set number of replicas, a new container will be launched to meet the quantity requirement.</p> +<pre tabindex="0"><code>$ drycc ps:delete python-getting-started-web-69b7d4bfdc-kl4xf +Deleting python-getting-started-web-69b7d4bfdc-kl4xf from python-getting-started... done +</code></pre><h2 id="get-a-shell-to-a-running-container">Get a Shell to a Running Container<a class="td-heading-self-link" href="#get-a-shell-to-a-running-container" aria-label="Heading self-link"></a></h2> +<p>Verify that the container is running:</p> +<pre tabindex="0"><code>$ 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) +</code></pre><p>Get a shell to the running container:</p> +<pre tabindex="0"><code>$ drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -it -- bash +</code></pre><p>In your shell, list the root directory:</p> +<pre tabindex="0"><code># Run this inside the container +ls / +</code></pre><p>Running individual commands in a container</p> +<pre tabindex="0"><code>$ drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -- date +</code></pre><p>Use &ldquo;drycc ps &ndash;help&rdquo; for a list of global command-line (applies to all commands).</p> +<h2 id="restarting-an-application-processes">Restarting an Application Processes<a class="td-heading-self-link" href="#restarting-an-application-processes" aria-label="Heading self-link"></a></h2> +<p>If you need to restart an application process, you may use <code>drycc pts:restart</code>. Behind the scenes, Drycc Workflow instructs +Kubernetes to terminate the old process and launch a new one in its place.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Notice that the process name has changed from <code>scenic-icehouse-background-3291896318-yf8kh</code> to +<code>scenic-icehouse-background-3291896318-yd87g</code>. In a multi-node Kubernetes cluster, this may also have the effect of scheduling +the Pod to a new node.</p> +<p>Use &ldquo;drycc pts &ndash;help&rdquo; for a list of pts command-line (process types info).</p> +<h2 id="list-an-application-process-types">List an Application Process Types<a class="td-heading-self-link" href="#list-an-application-process-types" aria-label="Heading self-link"></a></h2> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="get-deployment-info-of-the-application-process-type">Get deployment info of the application process type<a class="td-heading-self-link" href="#get-deployment-info-of-the-application-process-type" aria-label="Heading self-link"></a></h2> +<pre tabindex="0"><code>$ 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 +</code></pre> + + + + + Docs: Platform Monitoring + /docs/managing-workflow/platform-monitoring/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/platform-monitoring/ + + + + <h2 id="description">Description<a class="td-heading-self-link" href="#description" aria-label="Heading self-link"></a></h2> +<p>We now include a monitoring stack for introspection on a running Kubernetes cluster. The stack includes 4 components:</p> +<ul> +<li><a href="https://github.com/kubernetes/kube-state-metrics">kube-state-metrics</a>, kube-state-metrics (KSM) is a simple service that listens to the Kubernetes API server and generates metrics about the state of the objects.</li> +<li><a href="http://github.com/prometheus/node_exporter">Node Exporter</a>, Prometheus exporter for hardware and OS metrics exposed by *NIX kernels.</li> +<li><a href="https://prometheus.io/">Prometheus</a>, a <a href="https://cncf.io/">Cloud Native Computing Foundation</a> project, is a systems and service monitoring system.</li> +<li><a href="http://grafana.org/">Grafana</a>, Graphing tool for time series data</li> +</ul> +<h2 id="architecture-diagram">Architecture Diagram<a class="td-heading-self-link" href="#architecture-diagram" aria-label="Heading self-link"></a></h2> +<pre tabindex="0"><code>┌────────────────┐ +│ HOST │ +│ node-exporter │◀──┐ ┌──────────────────┐ +└────────────────┘ │ │kube-state-metrics│ + │ └──────────────────┘ +┌────────────────┐ │ ▲ +│ HOST │ │ ┌────────────┐ │ +│ node-exporter │◀──┼────│ Prometheus │─────────────┘ +└────────────────┘ │ └────────────┘ + │ ▲ +┌───────────────┐ │ │ +│ HOST │ │ ▼ +│ node-exporter│◀───┘ ┌──────────┐ +└───────────────┘ │ Grafana │ + └──────────┘ +</code></pre><h2 id="grafanahttpsgrafanacom"><a href="https://grafana.com/">Grafana</a><a class="td-heading-self-link" href="#grafanahttpsgrafanacom" aria-label="Heading self-link"></a></h2> +<p>Grafana allows users to create custom dashboards that visualize the data captured to the running Prometheus component. By default Grafana is exposed using a <a href="https://github.com/drycc/router#how-it-works">service annotation</a> through the router at the following URL: <code>http://grafana.mydomain.com</code>. The default login is <code>admin/admin</code>. If you are interested in changing these values please see [Tuning Component Settings][].</p> +<p>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&rsquo;t include every item that might be desirable to monitor in a +production installation.</p> +<p>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.</p> +<h3 id="production-configuration">Production Configuration<a class="td-heading-self-link" href="#production-configuration" aria-label="Heading self-link"></a></h3> +<p>A production install of Grafana should have the following configuration values changed if possible:</p> +<ul> +<li>Change the default username and password from <code>admin/admin</code>. 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.</li> +<li>Enable persistence</li> +<li>Use a supported external database such as mysql or postgres. You can find more information <a href="https://github.com/drycc/monitor/blob/main/grafana/rootfs/usr/share/grafana/grafana.ini.tpl#L62">here</a></li> +</ul> +<h3 id="on-cluster-persistence">On Cluster Persistence<a class="td-heading-self-link" href="#on-cluster-persistence" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p>If you wish to have persistence for Grafana you can set <code>enabled</code> to <code>true</code> in the <code>values.yaml</code> file before running <code>helm install</code>.</p> +<pre tabindex="0"><code> 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 +</code></pre><h3 id="off-cluster-grafana">Off Cluster Grafana<a class="td-heading-self-link" href="#off-cluster-grafana" aria-label="Heading self-link"></a></h3> +<p>If you wish to provide your own Grafana instance you can set <code>grafanaLocation</code> in the <code>values.yaml</code> file before running <code>helm install</code>.</p> +<h2 id="prometheushttpsprometheusio"><a href="https://prometheus.io/">Prometheus</a><a class="td-heading-self-link" href="#prometheushttpsprometheusio" aria-label="Heading self-link"></a></h2> +<p>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 <code>prometheus.mydomain.com</code>.</p> +<h3 id="on-cluster-persistence-1">On Cluster Persistence<a class="td-heading-self-link" href="#on-cluster-persistence-1" aria-label="Heading self-link"></a></h3> +<p>You can set <code>node-exporter</code> and <code>kube-state-metrics</code> to <code>true</code> or <code>false</code> in the <code>values.yaml</code>. +If you wish to have persistence for Prometheus you can set <code>enabled</code> to <code>true</code> in the <code>values.yaml</code> file before running <code>helm install</code>.</p> +<pre tabindex="0"><code>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 +</code></pre><h3 id="off-cluster-prometheus">Off Cluster Prometheus<a class="td-heading-self-link" href="#off-cluster-prometheus" aria-label="Heading self-link"></a></h3> +<p>To use off-cluster Prometheus, please provide the following values in the <code>values.yaml</code> file before running <code>helm install</code>.</p> +<ul> +<li><code>global.prometheusLocation=off-cluster</code></li> +<li><code>url = &quot;http://my.prometheus.url:9090&quot;</code></li> +</ul> + + + + + + Docs: Submitting a Pull Request + /docs/contribution-guidelines/submitting-a-pull-request/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/submitting-a-pull-request/ + + + + <h2 id="design-document">Design Document<a class="td-heading-self-link" href="#design-document" aria-label="Heading self-link"></a></h2> +<p>Before opening a pull request, ensure your change also references a design document if the contribution is substantial. For more information, see <a href="/docs/contribution-guidelines/design-documents/">Design Documents</a>.</p> +<h2 id="single-issue">Single Issue<a class="td-heading-self-link" href="#single-issue" aria-label="Heading self-link"></a></h2> +<p>It&rsquo;s hard to reach agreement on the merit of a PR when it isn&rsquo;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.</p> +<p>Squash and rebase the commit or commits in your pull request into logical units of work with <code>git</code>. Include tests and documentation changes in the same commit, so that a revert would remove all traces of the feature or fix.</p> +<p>Most pull requests will reference a GitHub issue. In the PR description - not in the commit itself - include a line such as &ldquo;closes #1234&rdquo;. The issue referenced will automatically be closed when your PR is merged.</p> +<h2 id="include-tests">Include Tests<a class="td-heading-self-link" href="#include-tests" aria-label="Heading self-link"></a></h2> +<p>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 <a href="https://github.com/drycc/workflow-e2e">drycc/workflow-e2e</a> repository.</p> +<p>See <a href="/docs/contribution-guidelines/testing/">testing</a> for more information.</p> +<h2 id="include-docs">Include Docs<a class="td-heading-self-link" href="#include-docs" aria-label="Heading self-link"></a></h2> +<p>Changes to any Drycc Workflow component that could affect a user&rsquo;s experience also require a change or addition to the relevant documentation. For most Drycc components, this involves updating the component&rsquo;s <em>own</em> documentation. In some cases where a component is tightly integrated into <a href="https://github.com/drycc/workflow">drycc/workflow</a>, its documentation must also be updated.</p> +<h2 id="cross-repo-commits">Cross-repo commits<a class="td-heading-self-link" href="#cross-repo-commits" aria-label="Heading self-link"></a></h2> +<p>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 <a href="https://ci.drycc.info/job/workflow-e2e-pr/">e2e test job</a> 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.</p> +<p>For example, consider paired commits in <a href="https://github.com/drycc/controller">drycc/controller</a> and <a href="https://github.com/drycc/workflow-e2e">drycc/workflow-e2e</a>. The commit body for the first PR in <code>drycc/workflow-e2e</code> would look like:</p> +<pre tabindex="0"><code>feat(foo_test): add e2e test for feature foo + +[skip e2e] test for controller#42 +</code></pre><p>Adding <code>[skip e2e]</code> 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.</p> +<p>Lastly, the final PR in <code>drycc/controller</code> should be created with the required PR number(s) listed, in the form of <code>[Rr]equires &lt;repoName&gt;#&lt;pullRequestNumber&gt;</code>, for use by the downstream e2e run.</p> +<pre tabindex="0"><code>feat(foo): add feature foo + +Requires workflow-e2e#42 +</code></pre><h2 id="code-standards">Code Standards<a class="td-heading-self-link" href="#code-standards" aria-label="Heading self-link"></a></h2> +<p>Drycc components are implemented in <a href="http://golang.org/">Go</a> and <a href="http://www.python.org/">Python</a>. For both languages, we agree with <a href="http://www.python.org/dev/peps/pep-0020/">The Zen of Python</a>, which emphasizes simple over clever. Readability counts.</p> +<p>Go code should always be run through <code>gofmt</code> 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 <a href="https://github.com/Masterminds/glide">glide</a> tool.</p> +<p>Python code should always adhere to <a href="http://www.python.org/dev/peps/pep-0008/">PEP8</a>, 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 <a href="https://pypi.python.org/pypi/flake8/">flake8</a> tool used by Drycc does not enforce this.</p> +<h2 id="commit-style">Commit Style<a class="td-heading-self-link" href="#commit-style" aria-label="Heading self-link"></a></h2> +<p>We follow a convention for commit messages borrowed from CoreOS, who borrowed theirs +from AngularJS. This is an example of a commit:</p> +<pre tabindex="0"><code>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. +</code></pre><p>To make it more formal, it looks something like this:</p> +<pre tabindex="0"><code>{type}({scope}): {subject} +&lt;BLANK LINE&gt; +{body} +&lt;BLANK LINE&gt; +{footer} +</code></pre><p>The allowed <code>{types}</code> are as follows:</p> +<ul> +<li><code>feat</code> -&gt; feature</li> +<li><code>fix</code> -&gt; bug fix</li> +<li><code>docs</code> -&gt; documentation</li> +<li><code>style</code> -&gt; formatting</li> +<li><code>ref</code> -&gt; refactoring code</li> +<li><code>test</code> -&gt; adding missing tests</li> +<li><code>chore</code> -&gt; maintenance</li> +</ul> +<p>The <code>{scope}</code> can be anything specifying the location(s) of the commit change(s).</p> +<p>The <code>{subject}</code> 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.</p> +<p>Just like the <code>{subject}</code>, the message <code>{body}</code> 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.</p> +<p>All breaking changes need to be mentioned in the <code>{footer}</code> with the description of the +change, the justification behind the change and any migration notes required.</p> +<p>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.</p> +<h2 id="merge-approval">Merge Approval<a class="td-heading-self-link" href="#merge-approval" aria-label="Heading self-link"></a></h2> +<p>Any code change - other than a simple typo fix or one-line documentation change - requires at least two <a href="/docs/contribution-guidelines/maintainers/">Drycc maintainers</a> to accept it. Maintainers tag pull requests with &ldquo;<strong>LGTM1</strong>&rdquo; and &ldquo;<strong>LGTM2</strong>&rdquo; (Looks Good To Me) labels to indicate acceptance.</p> +<p>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.</p> +<p>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.</p> +<p>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.</p> + + + + + + Docs: Community + /docs/contribution-guidelines/community/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/community/ + + + + <p>Drycc software is fully open source. As such, the &ldquo;Drycc community&rdquo; 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.</p> +<p>Drycc development is coordinated through numerous project repositories <a href="https://github.com/drycc">on GitHub</a>. 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.</p> +<p><a href="https://www.drycc.cc/community">Engine Yard</a> 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.</p> +<p>Drycc uses the timeless, highly efficient, and totally unfair system known as &ldquo;Benevolent Dictator for Life&rdquo; (<a href="http://en.wikipedia.org/wiki/Benevolent_Dictator_for_Life">BDFL</a>). <a href="https://github.com/gabrtv">Gabriel Monroy</a>, the creator of Drycc, is our BDFL and has final say over all decisions related to Drycc.</p> +<h2 id="open-source-bounties">Open Source Bounties<a class="td-heading-self-link" href="#open-source-bounties" aria-label="Heading self-link"></a></h2> +<p>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.</p> + + + + + + Docs: Controller API v2.3 + /docs/reference-guide/controller-api-v2-3/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/reference-guide/controller-api-v2-3/ + + + + <h2 id="whats-new">What&rsquo;s New<a class="td-heading-self-link" href="#whats-new" aria-label="Heading self-link"></a></h2> +<p><strong>New!</strong> <code>/v2/apps/{name}/logs</code> endpoint was fixed and no longer returns <code>b'log data'</code> and instead returns a normal string <code>log data</code></p> +<h2 id="authentication">Authentication<a class="td-heading-self-link" href="#authentication" aria-label="Heading self-link"></a></h2> +<h3 id="register-a-new-user">Register a New User<a class="td-heading-self-link" href="#register-a-new-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/register/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{ + &#34;username&#34;: &#34;test&#34;, + &#34;password&#34;: &#34;opensesame&#34;, + &#34;email&#34;: &#34;test@example.com&#34; +} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] +} +</code></pre><h3 id="log-in">Log in<a class="td-heading-self-link" href="#log-in" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/login/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{&#34;username&#34;: &#34;test&#34;, &#34;password&#34;: &#34;opensesame&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="cancel-account">Cancel Account<a class="td-heading-self-link" href="#cancel-account" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/auth/cancel/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="who-am-i">Who Am I<a class="td-heading-self-link" href="#who-am-i" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/auth/whoami/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] +} +</code></pre><h3 id="regenerate-token">Regenerate Token<a class="td-heading-self-link" href="#regenerate-token" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command could require administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/tokens/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;username&#34; : &#34;test&#34; + &#34;all&#34; : &#34;true&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="change-password">Change Password<a class="td-heading-self-link" href="#change-password" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/passwd/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;password&#34;: &#34;foo&#34;, + &#34;new_password&#34;: &#34;bar&#34; +} +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;username&#34;: &#34;testuser&#34;} +</code></pre><blockquote> +<p><strong>note</strong></p> +<p>Using the <code>username</code> parameter requires administrative privileges and makes the <code>password</code> parameter optional.</p> +</blockquote> +<p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h2 id="applications">Applications<a class="td-heading-self-link" href="#applications" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-applications">List all Applications<a class="td-heading-self-link" href="#list-all-applications" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;id&#34;: &#34;example-go&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="destroy-an-application">Destroy an Application<a class="td-heading-self-link" href="#destroy-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="list-application-details">List Application Details<a class="td-heading-self-link" href="#list-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="update-application-details">Update Application Details<a class="td-heading-self-link" href="#update-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{ + &#34;owner&#34;: &#34;test&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 1.8.0 +Content-Type: application/json +</code></pre><h3 id="retrieve-application-logs">Retrieve Application Logs<a class="td-heading-self-link" href="#retrieve-application-logs" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/logs/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional URL Query Parameters:</p> +<pre tabindex="0"><code>?log_lines= +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: text/plain + +&#34;16:51:14 drycc[api]: test created initial release\n&#34; +</code></pre><h3 id="run-one-off-commands">Run one-off Commands<a class="td-heading-self-link" href="#run-one-off-commands" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>POST /v2/apps/example-go/run/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;command&#34;: &#34;echo hi&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{&#34;exit_code&#34;: 0, &#34;output&#34;: &#34;hi\n&#34;} +</code></pre><h2 id="certificates">Certificates<a class="td-heading-self-link" href="#certificates" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-certificates">List all Certificates<a class="td-heading-self-link" href="#list-all-certificates" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22.32.34:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22.32.34:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; + } + ] +} +</code></pre><h3 id="get-certificate-details">Get Certificate Details<a class="td-heading-self-link" href="#get-certificate-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22.32.34:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22.32.34:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="create-certificate">Create Certificate<a class="td-heading-self-link" href="#create-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{ + &#34;name&#34;: &#34;foo&#34; + &#34;certificate&#34;: &#34;-----BEGIN CERTIFICATE-----&#34;, + &#34;key&#34;: &#34;-----BEGIN RSA PRIVATE KEY-----&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22.32.34:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22.32.34:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="destroy-a-certificate">Destroy a Certificate<a class="td-heading-self-link" href="#destroy-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="attach-a-domain-to-a-certificate">Attach a Domain to a Certificate<a class="td-heading-self-link" href="#attach-a-domain-to-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/foo/domain/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;domain&#34;: &#34;test.com&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="remove-a-domain-from-a-certificate">Remove a Domain from a Certificate<a class="td-heading-self-link" href="#remove-a-domain-from-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="enable-or-disable-tls">Enable or disable TLS<a class="td-heading-self-link" href="#enable-or-disable-tls" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/tls/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{ + &#34;https_enforced&#34;: true +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;https_enforced&#34;: true, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="get-tls-status">Get TLS status<a class="td-heading-self-link" href="#get-tls-status" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/tls/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;https_enforced&#34;: false, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="pods">Pods<a class="td-heading-self-link" href="#pods" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-pods">List all Pods<a class="td-heading-self-link" href="#list-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="list-all-pods-by-type">List all Pods by Type<a class="td-heading-self-link" href="#list-all-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/web/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="restart-all-pods">Restart All Pods<a class="td-heading-self-link" href="#restart-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type">Restart Pods by Type<a class="td-heading-self-link" href="#restart-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type-and-name">Restart Pods by Type and Name<a class="td-heading-self-link" href="#restart-pods-by-type-and-name" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="scale-pods">Scale Pods<a class="td-heading-self-link" href="#scale-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/scale/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;web&#34;: 3} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h2 id="configuration">Configuration<a class="td-heading-self-link" href="#configuration" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-configuration">List Application Configuration<a class="td-heading-self-link" href="#list-application-configuration" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="create-new-config">Create new Config<a class="td-heading-self-link" href="#create-new-config" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: &#34;world&#34;, &#34;PLATFORM&#34;: &#34;drycc&#34;}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v3&#34;, + &#34;HELLO&#34;: &#34;world&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="unset-config-variable">Unset Config Variable<a class="td-heading-self-link" href="#unset-config-variable" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: null}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v4&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="domains">Domains<a class="td-heading-self-link" href="#domains" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-domains">List Application Domains<a class="td-heading-self-link" href="#list-application-domains" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; + } + ] +} +</code></pre><h3 id="add-domain">Add Domain<a class="td-heading-self-link" href="#add-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#39;domain&#39;: &#39;example.example.com&#39;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; +} +</code></pre><h3 id="remove-domain">Remove Domain<a class="td-heading-self-link" href="#remove-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h2 id="builds">Builds<a class="td-heading-self-link" href="#builds" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-builds">List Application Builds<a class="td-heading-self-link" href="#list-application-builds" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\&#34;/runner/init\&#34;] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db&#34;, + &#34;image&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: { + &#34;web&#34;: &#34;example-go&#34; + }, + &#34;sha&#34;: &#34;060da68f&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-application-build">Create Application Build<a class="td-heading-self-link" href="#create-application-build" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;image&#34;: &#34;drycc/example-go:latest&#34;} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;procfile&#34;: { + &#34;web&#34;: &#34;./cmd&#34; + } +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;&#34;, + &#34;image&#34;: &#34;drycc/example-go:latest&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: {}, + &#34;sha&#34;: &#34;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-releases">List Application Releases<a class="td-heading-self-link" href="#list-application-releases" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 3, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;2.3d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;ed637ceb-5d32-44bd-9406-d326a777a513&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test changed nothing&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 3 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;2.3d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test deployed 060da68&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 2 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 + } + ] +} +</code></pre><h3 id="list-release-details">List Release Details<a class="td-heading-self-link" href="#list-release-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/v2/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 +} +</code></pre><h3 id="rollback-release">Rollback Release<a class="td-heading-self-link" href="#rollback-release" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;version&#34;: 1} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{&#34;version&#34;: 5} +</code></pre><h2 id="keys">Keys<a class="td-heading-self-link" href="#keys" aria-label="Heading self-link"></a></h2> +<h3 id="list-keys">List Keys<a class="td-heading-self-link" href="#list-keys" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;test@example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="add-key-to-user">Add Key to User<a class="td-heading-self-link" href="#add-key-to-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;id&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example&#34;, + &#34;owner&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="remove-key-from-user">Remove Key from User<a class="td-heading-self-link" href="#remove-key-from-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/keys/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h2 id="permissions">Permissions<a class="td-heading-self-link" href="#permissions" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-permissions">List Application Permissions<a class="td-heading-self-link" href="#list-application-permissions" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This does not include the app owner.</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;users&#34;: [ + &#34;test&#34;, + &#34;foo&#34; + ] +} +</code></pre><h3 id="create-application-permission">Create Application Permission<a class="td-heading-self-link" href="#create-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="remove-application-permission">Remove Application Permission<a class="td-heading-self-link" href="#remove-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="list-administrators">List Administrators<a class="td-heading-self-link" href="#list-administrators" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/admin/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 2, + &#34;next&#34;: null + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;username&#34;: &#34;test&#34;, + &#34;is_superuser&#34;: true + }, + { + &#34;username&#34;: &#34;foo&#34;, + &#34;is_superuser&#34;: true + } + ] +} +</code></pre><h3 id="grant-user-administrative-privileges">Grant User Administrative Privileges<a class="td-heading-self-link" href="#grant-user-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/admin/perms HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="remove-users-administrative-privileges">Remove User&rsquo;s Administrative Privileges<a class="td-heading-self-link" href="#remove-users-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/admin/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h2 id="users">Users<a class="td-heading-self-link" href="#users" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-users">List all users<a class="td-heading-self-link" href="#list-all-users" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/users HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] + } + ] +} +</code></pre> + + + + + Docs: Configuring an Application + /docs/applications/managing-app-configuration/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/managing-app-configuration/ + + + + <h1 id="configuring-an-application">Configuring an Application<a class="td-heading-self-link" href="#configuring-an-application" aria-label="Heading self-link"></a></h1> +<p>A Drycc application <a href="http://12factor.net/config">stores config in environment variables</a>.</p> +<h2 id="setting-environment-variables">Setting Environment Variables<a class="td-heading-self-link" href="#setting-environment-variables" aria-label="Heading self-link"></a></h2> +<p>Use <code>drycc config</code> to modify environment variables for a deployed application.</p> +<pre><code>$ 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. +</code></pre> +<p>When config is changed, a new release is created and deployed automatically.</p> +<p>You can set multiple environment variables with one <code>drycc config:set</code> command, +or with <code>drycc config:push</code> and a local .env file.</p> +<pre><code>$ drycc config:set FOO=1 BAR=baz &amp;&amp; drycc config:pull +$ cat .env +FOO=1 +BAR=baz +$ echo &quot;TIDE=high&quot; &gt;&gt; .env +$ drycc config:push +Creating config... done, v4 + +=== yuppie-earthman +DRYCC_APP: yuppie-earthman +FOO: 1 +BAR: baz +TIDE: high +</code></pre> +<p>It can also modify environment variables for a process type of application.</p> +<pre><code>$ drycc config:set FOO=1 BAR=baz --ptype=web +</code></pre> +<h2 id="attach-to-backing-services">Attach to Backing Services<a class="td-heading-self-link" href="#attach-to-backing-services" aria-label="Heading self-link"></a></h2> +<p>Drycc treats backing services like databases, caches and queues as <a href="http://12factor.net/backing-services">attached resources</a>. +Attachments are performed using environment variables.</p> +<p>For example, use <code>drycc config</code> to set a <code>DATABASE_URL</code> that attaches +the application to an external PostgreSQL database.</p> +<pre><code>$ drycc config:set DATABASE_URL=postgres://user:pass@example.com:5432/db +=== peachy-waxworks +DATABASE_URL: postgres://user:pass@example.com:5432/db +</code></pre> +<p>Detachments can be performed with <code>drycc config:unset</code>.</p> +<h2 id="buildpacks-cache">Buildpacks Cache<a class="td-heading-self-link" href="#buildpacks-cache" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<h3 id="disabling-and-re-enabling-the-cache">Disabling and re-enabling the cache<a class="td-heading-self-link" href="#disabling-and-re-enabling-the-cache" aria-label="Heading self-link"></a></h3> +<p>In some cases, cache might not speed up your application. To disable caching, you can set the +<code>DRYCC_DISABLE_CACHE</code> variable with <code>drycc config:set DRYCC_DISABLE_CACHE=1</code>. When you disable the +cache, Drycc will clear up files it created to store the cache. After having it turned off, run +<code>drycc config:unset DRYCC_DISABLE_CACHE</code> to re-enable the cache.</p> +<h3 id="clearing-the-cache">Clearing the cache<a class="td-heading-self-link" href="#clearing-the-cache" aria-label="Heading self-link"></a></h3> +<p>Use the following procedure to clear the cache:</p> +<pre><code>$ drycc config:set DRYCC_DISABLE_CACHE=1 +$ git commit --allow-empty -m &quot;Clearing Drycc cache&quot; +$ git push drycc # (if you use a different remote, you should use your remote name) +$ drycc config:unset DRYCC_DISABLE_CACHE +</code></pre> +<h2 id="custom-health-checks">Custom Health Checks<a class="td-heading-self-link" href="#custom-health-checks" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>The health checks are implemented as <a href="https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes">Kubernetes container probes</a>. A <code>liveness</code> +and a <code>readiness</code> probe can be configured, and each probe can be of type <code>httpGet</code>, <code>exec</code>, or +<code>tcpSocket</code> depending on the type of probe the container requires.</p> +<p>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.</p> +<p>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.</p> +<p><code>httpGet</code> 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.</p> +<p><code>exec</code> probes run a command inside the Container to determine its health, such as +<code>cat /var/run/myapp.pid</code> 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.</p> +<p><code>tcpSocket</code> probes attempt to open a socket in the Container. The Container is only considered +healthy if the check can establish a connection. <code>tcpSocket</code> probes accept a port number to perform +the socket connection on the Container.</p> +<p>Health checks can be configured on a per-proctype basis for each application using <code>drycc healthchecks:set</code>. If no type is mentioned then the health checks are applied to default proc type web, whichever is present. To +configure a <code>httpGet</code> liveness probe:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>If the application relies on certain headers being set (such as the <code>Host</code> header) or a specific +URL path relative to the root, you can also send specific HTTP headers:</p> +<pre tabindex="0"><code>$ drycc healthchecks:set liveness httpGet 80 \ + --path /welcome/index.html \ + --headers &#34;X-Client-Version:v1.0,X-Foo:bar&#34; +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 +</code></pre><p>To configure an <code>exec</code> readiness probe:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>You can overwrite a probe by running <code>drycc healthchecks:set</code> again:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>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.</p> +<h2 id="autodeploy">Autodeploy<a class="td-heading-self-link" href="#autodeploy" aria-label="Heading self-link"></a></h2> +<p>By default, Changes the config, limits or healthchecks and so on will trigger deploy. +If you don&rsquo;t want deploy, you can disable.</p> +<pre tabindex="0"><code>$ drycc autodeploy:disable +</code></pre><p>To re-enable autodeploy.</p> +<pre tabindex="0"><code>drycc autodeploy:enable +</code></pre><p>you can deploy by executing the following command. +deploy all ptypes</p> +<pre tabindex="0"><code>drycc releases:deploy +</code></pre><p>deploy web process type, and support <code>--force</code> option to force deploy.</p> +<pre tabindex="0"><code>drycc releases:deploy web --force +</code></pre><h2 id="autorollback">Autorollback<a class="td-heading-self-link" href="#autorollback" aria-label="Heading self-link"></a></h2> +<p>By default, deployment failures will roll back to the previous successful version. +If you don&rsquo;t want this to happen, you can disable.</p> +<pre tabindex="0"><code>$ drycc autorollback:disable +</code></pre><p>To re-enable autorollback.</p> +<pre tabindex="0"><code>drycc autorollback:enable +</code></pre><h2 id="isolate-the-application">Isolate the Application<a class="td-heading-self-link" href="#isolate-the-application" aria-label="Heading self-link"></a></h2> +<p>Workflow supports isolating applications onto a set of nodes using <code>drycc tags</code>.</p> +<p>!!! 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 <a href="http://kubernetes.io/docs/user-guide/node-selection/">&ldquo;Assigning Pods to Nodes&rdquo;</a>.</p> +<p>Once your nodes are configured with appropriate label selectors, use <code>drycc tags:set</code> to restrict +the application ptype to those nodes:</p> +<pre tabindex="0"><code>$ drycc tags:set web environ=prod +Applying tags... done, v4 + +environ prod +</code></pre> + + + + + Docs: Managing Application Metrics + /docs/applications/managing-app-metrics/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/managing-app-metrics/ + + + + <h2 id="create-an-authentication-token">Create an authentication token<a class="td-heading-self-link" href="#create-an-authentication-token" aria-label="Heading self-link"></a></h2> +<p>Create an authentication token using the drycc client.</p> +<pre tabindex="0"><code># drycc tokens:add prometheus --password admin --username admin + ! WARNING: Make sure to copy your token now. + ! You won&#39;t be able to see it again, please confirm whether to continue. + ! To proceed, type &#34;yes&#34; ! + +&gt; yes +UUID USERNAME TOKEN +58176cf1-37a8-4c52-9b27-4c7a47269dfb admin 1F2c7A802aF640fd9F31dD846AdDf56BcMsay +</code></pre><h2 id="add-scrape-configurations-for-prometheus">Add scrape configurations for prometheus<a class="td-heading-self-link" href="#add-scrape-configurations-for-prometheus" aria-label="Heading self-link"></a></h2> +<p>A valid example file can be found here.</p> +<p>The global configuration specifies parameters that are valid in all other configuration contexts. They also serve as defaults for other configuration sections.</p> +<pre tabindex="0"><code>global: + scrape_interval: 60s + evaluation_interval: 60s +scrape_configs: +- job_name: &#39;drycc&#39; + scheme: https + metrics_path: /v2/apps/&lt;appname&gt;/metrics + authorization: + type: Token + credentials: 1F2c7A802aF640fd9F31dD846AdDf56BcMsay + static_configs: + - targets: [&#39;drycc.domain.com&#39;] +</code></pre> + + + + + Docs: Production Deployments + /docs/managing-workflow/production-deployments/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/production-deployments/ + + + + <h2 id="running-workflow-without-drycc-storage">Running Workflow without drycc storage<a class="td-heading-self-link" href="#running-workflow-without-drycc-storage" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>Running a Workflow cluster without Storage provides several advantages:</p> +<ul> +<li>Removal of state from the worker nodes</li> +<li>Reduced resource usage</li> +<li>Reduced complexity and operational burden of managing Workflow</li> +</ul> +<p>See <a href="/docs/installing-workflow/configuring-object-storage/">Configuring Object Storage</a> for details on removing this operational complexity.</p> +<h2 id="review-security-considerations">Review Security Considerations<a class="td-heading-self-link" href="#review-security-considerations" aria-label="Heading self-link"></a></h2> +<p>There are some additional security-related considerations when running Workflow in production. +See [Security Considerations][] for details.</p> +<h2 id="registration-is-admin-only">Registration is Admin-Only<a class="td-heading-self-link" href="#registration-is-admin-only" aria-label="Heading self-link"></a></h2> +<p>By default, registration with the Workflow controller is in &ldquo;admin_only&rdquo; mode. The first user +to run a <code>drycc register</code> command becomes the initial &ldquo;admin&rdquo; user, and registrations after that +are disallowed unless requested by an admin.</p> +<p>Please see the following documentation to learn about changing registration mode:</p> +<ul> +<li><a href="/docs/managing-workflow/tuning-component-settings/#customizing-the-controller">Customizing Controller</a></li> +</ul> +<h2 id="disable-grafana-signups">Disable Grafana Signups<a class="td-heading-self-link" href="#disable-grafana-signups" aria-label="Heading self-link"></a></h2> +<p>It is also recommended to disable signups for the Grafana dashboards.</p> +<p>Please see the following documentation to learn about disabling Grafana signups:</p> +<ul> +<li><a href="/docs/managing-workflow/tuning-component-settings/#customizing-the-monitor">Customizing Monitor</a></li> +</ul> +<h2 id="running-workflow-with-rbac">Running Workflow with RBAC<a class="td-heading-self-link" href="#running-workflow-with-rbac" aria-label="Heading self-link"></a></h2> +<p>If your cluster has <a href="https://kubernetes.io/docs/admin/authorization/rbac/">RBAC</a> amongst your <a href="https://kubernetes.io/docs/admin/authorization/">authorization</a> modes (<code>$ kubectl api-versions</code> should contains <code>rbac.authorization.k8s.io</code>) it may be necessary to enable RBAC in Workflow. +This can be achieved by setting <code>use_rbac</code> in the <code>global</code> section of <code>values.yaml</code> to <code>true</code>, or by adding <code>--set=global.use_rbac=true</code> to the <code>$ helm install/upgrade</code> command. +RBAC support was announced in Kubernetes-1.5 and is enabled by default if:</p> +<ul> +<li>your Kubernetes cluster is in GKE</li> +<li>your Kubernetes cluster built with <a href="https://kubernetes.io/docs/getting-started-guides/kubeadm/">kubeadm</a></li> +</ul> +<p><strong>Note</strong>: helm may need to be given <a href="/docs/installing-workflow/#check-your-authorization">specific permissions</a> under RBAC if not already done.</p> +<p><strong>Attention</strong>: Azure ACS Kubernetes clusters are not RBAC-enabled for today due to lack in authentication strategy. Feel free to watch this <a href="https://github.com/kubernetes/kubernetes/pull/43987">PR</a> for more details.</p> + + + + + + Docs: Upgrading Workflow + /docs/managing-workflow/upgrading-workflow/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/upgrading-workflow/ + + + + <p>This upgrade process requires:</p> +<ul> +<li>Helm version <a href="https://github.com/kubernetes/helm/releases/tag/v2.1.0">2.1.0 or newer</a></li> +<li>Configured Off-Cluster Storage</li> +</ul> +<h2 id="upgrade-process">Upgrade Process<a class="td-heading-self-link" href="#upgrade-process" aria-label="Heading self-link"></a></h2> +<p>!!! note +If upgrading from a <a href="https://github.com/helm/helm-classic">Helm Classic</a> install, you&rsquo;ll need to &lsquo;migrate&rsquo; the cluster to a <a href="https://github.com/kubernetes/helm">Kubernetes Helm</a> installation. See <a href="https://github.com/drycc/workflow-migration/blob/main/README.md">Workflow-Migration</a> for steps.</p> +<h3 id="step-1-apply-the-workflow-upgrade">Step 1: Apply the Workflow upgrade<a class="td-heading-self-link" href="#step-1-apply-the-workflow-upgrade" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p>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.</p> +<p>First, find the name of the release helm gave to your deployment with <code>helm ls</code>, then run</p> +<pre tabindex="0"><code>$ helm upgrade &lt;release-name&gt; oci://registry.drycc.cc/charts/workflow +</code></pre><p><strong>Note:</strong> If using off-cluster object storage on <a href="https://cloud.google.com/storage/">gcs</a> and/or off-cluster registry using <a href="https://cloud.google.com/container-registry/">gcr</a> and intending to upgrade from a pre-<code>v2.10.0</code> chart to <code>v2.10.0</code> or greater, the <code>key_json</code> values will now need to be pre-base64-encoded. Therefore, assuming the rest of the custom/off-cluster values are defined in the existing <code>values.yaml</code> used for previous installs, the following may be run:</p> +<pre tabindex="0"><code>$ B64_KEY_JSON=&#34;$(cat ~/path/to/key.json | base64 -w 0)&#34; +$ helm upgrade &lt;release_name&gt; drycc/workflow -f values.yaml --set gcs.key_json=&#34;${B64_KEY_JSON}&#34;,registry-token-refresher.gcr.key_json=&#34;${B64_KEY_JSON}&#34; +</code></pre><p>Alternatively, simply replace the appropriate values in values.yaml and do without the <code>--set</code> +parameter. Make sure to wrap it in single quotes as double quotes will give a parser error when +upgrading.</p> +<h3 id="step-2-verify-upgrade">Step 2: Verify Upgrade<a class="td-heading-self-link" href="#step-2-verify-upgrade" aria-label="Heading self-link"></a></h3> +<p>Verify that all components have started and passed their readiness checks:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h3 id="step-3-upgrade-the-drycc-client">Step 3: Upgrade the Drycc Client<a class="td-heading-self-link" href="#step-3-upgrade-the-drycc-client" aria-label="Heading self-link"></a></h3> +<p>Users of Drycc Workflow should now upgrade their drycc client to avoid getting <code>WARNING: Client and server API versions do not match. Please consider upgrading.</code> warnings.</p> +<pre tabindex="0"><code>curl -sfL https://www.drycc.cc/install-cli.sh | bash - &amp;&amp; sudo mv drycc $(which drycc) +</code></pre> + + + + + Docs: Managing an Application + /docs/applications/managing-app-lifecycle/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/applications/managing-app-lifecycle/ + + + + <h2 id="track-application-changes">Track Application Changes<a class="td-heading-self-link" href="#track-application-changes" aria-label="Heading self-link"></a></h2> +<p>Drycc Workflow tracks all changes to your application. Application changes are the result of either new application code +pushed to the platform (via <code>git push drycc master</code>), or an update to application configuration (via <code>drycc config:set KEY=VAL</code>).</p> +<p>Each time a build or config change is made to your application a new <a href="../reference-guide/terms.md#release">release</a> is created. These release numbers +increase monotonically.</p> +<p>You can see a record of changes to your application using <code>drycc releases</code>:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="rollback-a-release">Rollback a Release<a class="td-heading-self-link" href="#rollback-a-release" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>!!! note +All rollbacks create a new, numbered release. But will reference the build/code and configuration from the desired rollback point.</p> +<p>In this example, the application is currently running release v4. Using <code>drycc rollback v2</code> 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:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Only rollback web process type:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="run-one-off-administration-tasks">Run One-off Administration Tasks<a class="td-heading-self-link" href="#run-one-off-administration-tasks" aria-label="Heading self-link"></a></h2> +<p>Drycc applications <a href="http://12factor.net/admin-processes">use one-off processes for admin tasks</a> like database migrations and other commands that must run against the live application.</p> +<p>Use <code>drycc run</code> to execute commands on the deployed application.</p> +<pre><code>$ 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 +</code></pre> +<h2 id="share-an-application">Share an Application<a class="td-heading-self-link" href="#share-an-application" aria-label="Heading self-link"></a></h2> +<p>Use <code>drycc perms:add</code> to allow another Drycc user to collaborate on your application.</p> +<pre tabindex="0"><code>$ drycc perms:add otheruser view,change,delete +Adding user otheruser as a collaborator for view,change,delete peachy-waxwork... done +</code></pre><p>Use <code>drycc perms</code> to see who an application is currently shared with, and <code>drycc perms:remove</code> to remove a collaborator.</p> +<p>!!! note +Collaborators can do anything with an application that its owner can do, except delete the application.</p> +<p>When working with an application that has been shared with you, clone the original repository and add Drycc&rsquo; git remote +entry before attempting to <code>git push</code> any changes to Drycc.</p> +<pre tabindex="0"><code>$ git clone https://github.com/drycc/example-java-jetty.git +Cloning into &#39;example-java-jetty&#39;... 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 -&gt; drycc/master +</code></pre><h2 id="application-troubleshooting">Application Troubleshooting<a class="td-heading-self-link" href="#application-troubleshooting" aria-label="Heading self-link"></a></h2> +<p>Applications deployed on Drycc Workflow <a href="http://12factor.net/logs">treat logs as event streams</a>. Drycc Workflow aggregates <code>stdout</code> and <code>stderr</code> +from every <a href="../reference-guide/terms.md#container">Container</a> making it easy to troubleshoot problems with your application.</p> +<p>Use <code>drycc logs</code> to view the log output from your deployed application.</p> +<pre><code>$ 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 +</code></pre> + + + + + + Docs: Triaging Issues + /docs/contribution-guidelines/triaging-issues/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/triaging-issues/ + + + + <p>Triage helps ensure issues resolve quickly by:</p> +<ul> +<li>Describing the issue&rsquo;s intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences an problem and what actions they took.</li> +<li>Giving a contributor the information they need before they commit to resolving an issue.</li> +<li>Lowering the issue count by preventing duplicate issues.</li> +<li>Streamlining the development process by preventing duplicate discussions.</li> +</ul> +<p>If you don&rsquo;t have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours.</p> +<h2 id="ensure-the-issue-contains-basic-information">Ensure the Issue Contains Basic Information<a class="td-heading-self-link" href="#ensure-the-issue-contains-basic-information" aria-label="Heading self-link"></a></h2> +<p>Before triaging an issue very far, make sure that the issue&rsquo;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:</p> +<ul> +<li>the version(s) of Drycc this issue affects</li> +<li>a reproducible case if this is a bug</li> +<li>page URL if this is a docs issue or the name of a man page</li> +</ul> +<p>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.</p> +<p>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&rsquo;s time.</p> +<p>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.</p> +<h2 id="classifying-the-issue">Classifying the Issue<a class="td-heading-self-link" href="#classifying-the-issue" aria-label="Heading self-link"></a></h2> +<p>An issue can have multiple of the following labels:</p> +<h3 id="issue-kind">Issue Kind<a class="td-heading-self-link" href="#issue-kind" aria-label="Heading self-link"></a></h3> +<table> +<thead> +<tr> +<th>Kind</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>bug</td> +<td>Bugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate.</td> +</tr> +<tr> +<td>docs</td> +<td>Writing documentation, man pages, articles, blogs, or other significant word-driven task.</td> +</tr> +<tr> +<td>enhancement</td> +<td>Enhancements can drastically improve usability or performance of a component.</td> +</tr> +<tr> +<td>question</td> +<td>Contains a user or contributor question requiring a response.</td> +</tr> +<tr> +<td>security</td> +<td>Security-related issues such as TLS encryption, network segregation, authn/authz features, etc.</td> +</tr> +</tbody> +</table> +<h3 id="functional-area">Functional Area<a class="td-heading-self-link" href="#functional-area" aria-label="Heading self-link"></a></h3> +<ul> +<li>builder</li> +<li>cache</li> +<li>contrib and provisioning</li> +<li>client</li> +<li>controller</li> +<li>database</li> +<li>docs</li> +<li>kubernetes</li> +<li>registry</li> +<li>router</li> +<li>store (Ceph)</li> +<li>tests</li> +</ul> +<h2 id="easy-fix">Easy Fix<a class="td-heading-self-link" href="#easy-fix" aria-label="Heading self-link"></a></h2> +<p>&ldquo;Easy Fix&rdquo; 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.</p> +<h2 id="prioritizing-issues">Prioritizing issues<a class="td-heading-self-link" href="#prioritizing-issues" aria-label="Heading self-link"></a></h2> +<p>When attached to a specific milestone, an issue can be attributed one of the following labels to indicate their degree of priority.</p> +<table> +<thead> +<tr> +<th>Priority</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>priority 0</td> +<td>Urgent: Security, critical bugs, blocking issues. Drop everything and fix this today, then consider creating a patch release.</td> +</tr> +<tr> +<td>priority 1</td> +<td>Serious: Impedes user actions or is a regression. Fix this before the next planned release.</td> +</tr> +</tbody> +</table> +<p>And that&rsquo;s it. That should be all the information required for a new or existing contributor to come in an resolve an issue.</p> + + + + + + Docs: Conduct + /docs/contribution-guidelines/conduct/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/contribution-guidelines/conduct/ + + + + <h1 id="conduct">Conduct<a class="td-heading-self-link" href="#conduct" aria-label="Heading self-link"></a></h1> +<p>The Drycc community welcomes and encourages participation by <strong>everyone</strong>.</p> +<p>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.</p> +<p>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:</p> +<ol> +<li> +<p><strong>Be welcoming, friendly, and patient.</strong></p> +</li> +<li> +<p><strong>Be considerate.</strong></p> +</li> +</ol> +<p>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&rsquo;re a world-wide community, so you might not be communicating in someone else&rsquo;s primary language.</p> +<ol start="3"> +<li><strong>Be respectful.</strong></li> +</ol> +<p>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.</p> +<ol start="4"> +<li><strong>Be careful in the words that you choose.</strong></li> +</ol> +<p>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.</p> +<p>(Thanks to the <a href="http://www.debian.org/intro/diversity">Debian</a> and <a href="https://www.djangoproject.com/conduct/">Django</a> communities for their text and +their inspiration.)</p> + + + + + + diff --git a/docs/installing-workflow/_print/index.html b/docs/installing-workflow/_print/index.html new file mode 100644 index 000000000..e13bd71a6 --- /dev/null +++ b/docs/installing-workflow/_print/index.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + + + + + + + + + +Installing To Kubenetes | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Installing To Kubenetes

+
Deploying Drycc on a Kubernetes Cluster.
+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + +
+ +

1 - Requirements

+
To run Drycc Workflow on a Kubernetes cluster, there are a few requirements to keep in mind.
+

Kubernetes Versions

+

Drycc Workflow requires Kubernetes v1.16.15 or later.

+

Components Requirements

+

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.

+

Storage Requirements

+

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.

+

Resource Requirements

+

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:

+
    +
  • At least 4GB of RAM (more is better)
  • +
  • At least 40GB of hard disk space
  • +
+

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.

+ +
+ + + + + + + + + + + +
+ +

2 - Specify Gateway

+
Choose the gateway provider that best suits your needs and platform.
+

Install Drycc Workflow (Specify gateway)

+

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
+

Install a Kubernetes Gateway

+

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
+

Configure DNS

+

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.

+ + + + + + + + + + + + + + + +
NameTypeValue
*.drycc.ccA138.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.

+ +
+ + + + + + + + + + + +
+ +

3 - Installing Drycc Workflow

+
This document is aimed at those who have already provisioned a Kubernetes cluster and want to install Drycc Workflow.
+

If help is required getting started with Kubernetes and +Drycc Workflow, follow the quickstart guide for assistance.

+

Prerequisites

+
    +
  1. Verify the Kubernetes system requirements
  2. +
  3. Install Helm and Drycc Workflow CLI tools
  4. +
+

Check Your Setup

+

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"}
+

Choose Your Deployment Strategy

+

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:

+ +

Gateway

+

Now, workflow requires that gateway and cert-manager must be installed. Any compatible Kubernetes entry controller can be used.

+

Install Drycc Workflow

+

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.

+

Configure DNS

+

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.

+ + + + + + + + + + + + + + + +
NameTypeValue
drycc-builder.drycc.ccA138.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.

+ +
+ + + + + + + + + + + +
+ +

4 - Configuring Object Storage

+
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 Storage by default, which provides in-cluster.

+

Configuring off-cluster Object Storage

+

Every component that relies on object storage uses two inputs for configuration:

+
    +
  1. You must use object storage services that are compatible with S3 API
  2. +
  3. Access credentials stored as a Kubernetes secret named storage-creds
  4. +
+

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.

+

Step 1: Create storage buckets

+

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.

+

Step 2: Generate storage credentials

+

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!

+

Step 3: Configure Workflow Chart

+

Operators should configure object storage by editing the Helm values file before running helm install. To do so:

+
    +
  • Fetch the Helm values by running helm inspect values oci://registry.drycc.cc/charts/workflow > values.yaml
  • +
  • Update the global/storage parameter to reference the platform you are using, e.g. s3, azure, gcs, or swift
  • +
  • Find the corresponding section for your storage type and provide appropriate values including region, bucket names, and access credentials.
  • +
  • Save your changes.
  • +
+

!!! 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.

+ +
+ + + + + + + + + + + +
+ +

5 - Configuring Postgres

+
Drycc Workflow’s controller and passport component rely on a PostgreSQL database to store platform state.
+

Configuring Postgres

+

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.

+

Provisioning off-cluster Postgres

+

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:

+
    +
  1. The hostname or public IP of your PostgreSQL RDBMS
  2. +
  3. The port on which your PostgreSQL RDBMS runs– typically 5432
  4. +
+

Within the off-cluster RDBMS, manually provision the following:

+
    +
  1. A database user (take note of the username and password)
  2. +
  3. A database owned by that user (take note of its name)
  4. +
+

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
+

Configuring Workflow

+

The Helm chart for Drycc Workflow can be easily configured to connect the Workflow controller component to an off-cluster PostgreSQL database.

+
    +
  • Step 1: If you haven’t already fetched the values, do so with helm inspect values drycc/workflow > values.yaml
  • +
  • Step 2: Update database connection details by modifying values.yaml: +
      +
    • Update the databaseLocation parameter to off-cluster.
    • +
    • Update the values in the [database] configuration section to properly reflect all connection details.
    • +
    • Update the values in the [controller] configuration section to properly reflect platformDomain details.
    • +
    • Save your changes.
    • +
    • Note: you do not need to (and must not) base64 encode any values, as the Helm chart will automatically handle encoding as necessary.
    • +
    +
  • +
+

You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml as usual.

+ +
+ + + + + + + + + + + +
+ +

6 - Configuring Registry

+
Drycc Workflow’s builder component relies on a registry for storing application container images.
+

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.

+

Configuring Off-Cluster Private Registry

+

Every component that relies on a registry uses two inputs for configuration:

+
    +
  1. Registry Location environment variable named DRYCC_REGISTRY_LOCATION
  2. +
  3. Access credentials stored as a Kubernetes secret named registry-secret
  4. +
+

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:

+
    +
  1. off-cluster: Any provider which supports long-lived username/password authentication, such as Azure Container Registry, Docker Hub, quay.io, or a self-hosted Container registry.
  2. +
+

Configuration

+
    +
  1. If you haven’t already fetched the values file, do so with helm inspect values drycc/workflow > values.yaml
  2. +
  3. Update registry location details by modifying the values file: +* Update the 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.
  4. +
+

You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml using your desired registry.

+

Examples

+

Here we show how the relevant parts of the fetched values.yaml file might look like after configuring for a particular off-cluster registry:

+

Azure Container Registry (ACR)

+

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.

+

Quay.io

+
global:
+...
+  registryLocation: "off-cluster"
+...
+registry-token-refresher:
+...
+  registry:
+    hostname: "quay.io"
+    organization: "myorg"
+    username: "myusername"
+    password: "mypassword"
+...
+
+
+ + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/docs/installing-workflow/configuring-object-storage/index.html b/docs/installing-workflow/configuring-object-storage/index.html new file mode 100644 index 000000000..5d1aa211c --- /dev/null +++ b/docs/installing-workflow/configuring-object-storage/index.html @@ -0,0 +1,496 @@ + + + + + + + + + + + + + + + + + + + +Configuring Object Storage | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Configuring Object Storage

+
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 Storage by default, which provides in-cluster.

+

Configuring off-cluster Object Storage

+

Every component that relies on object storage uses two inputs for configuration:

+
    +
  1. You must use object storage services that are compatible with S3 API
  2. +
  3. Access credentials stored as a Kubernetes secret named storage-creds
  4. +
+

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.

+

Step 1: Create storage buckets

+

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.

+

Step 2: Generate storage credentials

+

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!

+

Step 3: Configure Workflow Chart

+

Operators should configure object storage by editing the Helm values file before running helm install. To do so:

+
    +
  • Fetch the Helm values by running helm inspect values oci://registry.drycc.cc/charts/workflow > values.yaml
  • +
  • Update the global/storage parameter to reference the platform you are using, e.g. s3, azure, gcs, or swift
  • +
  • Find the corresponding section for your storage type and provide appropriate values including region, bucket names, and access credentials.
  • +
  • Save your changes.
  • +
+

!!! 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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/installing-workflow/configuring-postgres/index.html b/docs/installing-workflow/configuring-postgres/index.html new file mode 100644 index 000000000..5dd713ba7 --- /dev/null +++ b/docs/installing-workflow/configuring-postgres/index.html @@ -0,0 +1,494 @@ + + + + + + + + + + + + + + + + + + + +Configuring Postgres | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Configuring Postgres

+
Drycc Workflow’s controller and passport component rely on a PostgreSQL database to store platform state.
+ +

Configuring Postgres

+

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.

+

Provisioning off-cluster Postgres

+

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:

+
    +
  1. The hostname or public IP of your PostgreSQL RDBMS
  2. +
  3. The port on which your PostgreSQL RDBMS runs– typically 5432
  4. +
+

Within the off-cluster RDBMS, manually provision the following:

+
    +
  1. A database user (take note of the username and password)
  2. +
  3. A database owned by that user (take note of its name)
  4. +
+

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
+

Configuring Workflow

+

The Helm chart for Drycc Workflow can be easily configured to connect the Workflow controller component to an off-cluster PostgreSQL database.

+
    +
  • Step 1: If you haven’t already fetched the values, do so with helm inspect values drycc/workflow > values.yaml
  • +
  • Step 2: Update database connection details by modifying values.yaml: +
      +
    • Update the databaseLocation parameter to off-cluster.
    • +
    • Update the values in the [database] configuration section to properly reflect all connection details.
    • +
    • Update the values in the [controller] configuration section to properly reflect platformDomain details.
    • +
    • Save your changes.
    • +
    • Note: you do not need to (and must not) base64 encode any values, as the Helm chart will automatically handle encoding as necessary.
    • +
    +
  • +
+

You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml as usual.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/installing-workflow/configuring-registry/index.html b/docs/installing-workflow/configuring-registry/index.html new file mode 100644 index 000000000..1a7a81d08 --- /dev/null +++ b/docs/installing-workflow/configuring-registry/index.html @@ -0,0 +1,517 @@ + + + + + + + + + + + + + + + + + + + +Configuring Registry | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Configuring Registry

+
Drycc Workflow’s builder component relies on a registry for storing application container images.
+ +

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.

+

Configuring Off-Cluster Private Registry

+

Every component that relies on a registry uses two inputs for configuration:

+
    +
  1. Registry Location environment variable named DRYCC_REGISTRY_LOCATION
  2. +
  3. Access credentials stored as a Kubernetes secret named registry-secret
  4. +
+

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:

+
    +
  1. off-cluster: Any provider which supports long-lived username/password authentication, such as Azure Container Registry, Docker Hub, quay.io, or a self-hosted Container registry.
  2. +
+

Configuration

+
    +
  1. If you haven’t already fetched the values file, do so with helm inspect values drycc/workflow > values.yaml
  2. +
  3. Update registry location details by modifying the values file: +* Update the 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.
  4. +
+

You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml using your desired registry.

+

Examples

+

Here we show how the relevant parts of the fetched values.yaml file might look like after configuring for a particular off-cluster registry:

+

Azure Container Registry (ACR)

+

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.

+

Quay.io

+
global:
+...
+  registryLocation: "off-cluster"
+...
+registry-token-refresher:
+...
+  registry:
+    hostname: "quay.io"
+    organization: "myorg"
+    username: "myusername"
+    password: "mypassword"
+...
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/installing-workflow/download-linux-brightgreen.svg b/docs/installing-workflow/download-linux-brightgreen.svg new file mode 100644 index 000000000..a8a6a50be --- /dev/null +++ b/docs/installing-workflow/download-linux-brightgreen.svg @@ -0,0 +1 @@ +downloaddownloadLinuxLinux \ No newline at end of file diff --git a/docs/installing-workflow/download-osx-brightgreen.svg b/docs/installing-workflow/download-osx-brightgreen.svg new file mode 100644 index 000000000..477afbf52 --- /dev/null +++ b/docs/installing-workflow/download-osx-brightgreen.svg @@ -0,0 +1 @@ +downloaddownloadMac OS XMac OS X \ No newline at end of file diff --git a/docs/installing-workflow/gateway/index.html b/docs/installing-workflow/gateway/index.html new file mode 100644 index 000000000..0182f2a82 --- /dev/null +++ b/docs/installing-workflow/gateway/index.html @@ -0,0 +1,535 @@ + + + + + + + + + + + + + + + + + + + +Specify Gateway | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Specify Gateway

+
Choose the gateway provider that best suits your needs and platform.
+ +

Install Drycc Workflow (Specify gateway)

+

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
+

Install a Kubernetes Gateway

+

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
+

Configure DNS

+

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.

+ + + + + + + + + + + + + + + +
NameTypeValue
*.drycc.ccA138.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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/installing-workflow/index.html b/docs/installing-workflow/index.html new file mode 100644 index 000000000..8c0544ada --- /dev/null +++ b/docs/installing-workflow/index.html @@ -0,0 +1,490 @@ + + + + + + + + + + + + + + + + + + + + + +Installing To Kubenetes | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Installing To Kubenetes

+
Deploying Drycc on a Kubernetes Cluster.
+ + +
+ + +
+
+
+ Requirements +
+

To run Drycc Workflow on a Kubernetes cluster, there are a few requirements to keep in mind.

+
+
+
+ Specify Gateway +
+

Choose the gateway provider that best suits your needs and platform.

+
+
+
+ Installing Drycc Workflow +
+

This document is aimed at those who have already provisioned a Kubernetes cluster and want to install Drycc Workflow.

+
+
+
+ Configuring Object Storage +
+

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.

+
+
+
+ Configuring Postgres +
+

Drycc Workflow’s controller and passport component rely on a PostgreSQL database to store platform state.

+
+
+
+ Configuring Registry +
+

Drycc Workflow’s builder component relies on a registry for storing application container images.

+
+
+ +
+ + + + + + +
+ +
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/installing-workflow/index.xml b/docs/installing-workflow/index.xml new file mode 100644 index 000000000..925eecf20 --- /dev/null +++ b/docs/installing-workflow/index.xml @@ -0,0 +1,415 @@ + + + Drycc – Installing To Kubenetes + /docs/installing-workflow/ + Recent content in Installing To Kubenetes on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Docs: Requirements + /docs/installing-workflow/system-requirements/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/installing-workflow/system-requirements/ + + + + <h2 id="kubernetes-versions">Kubernetes Versions<a class="td-heading-self-link" href="#kubernetes-versions" aria-label="Heading self-link"></a></h2> +<p>Drycc Workflow requires Kubernetes v1.16.15 or later.</p> +<h2 id="components-requirements">Components Requirements<a class="td-heading-self-link" href="#components-requirements" aria-label="Heading self-link"></a></h2> +<p>Drycc uses gateway as a routing implementation, so you have to choose an gateway. We recommend using <a href="https://istio.io/">istio</a> or <a href="https://konghq.com/">kong</a>.</p> +<p>Workflow supports the use of ACME to manage automatic certificates, <a href="https://github.com/helm/charts/tree/master/stable/cert-manager">cert-manager</a> is also one of the necessary components, if you use cert-manager EAB, you need to set the <code>clusterResourceNamespace</code> to the namespace of drycc.</p> +<p>Workflow supports stateful apps. You can create and use them through the &lsquo;drycc volumes&rsquo; command. If you want to use this feature, you must have a <code>StorageClass</code> that supports <code>ReadWriteMany</code>.</p> +<p>Workflow also supports the <a href="https://github.com/openservicebrokerapi/servicebroker">OSB</a> API through the &lsquo;drycc resources&rsquo; command. If you want to use this function, you need to install <a href="https://service-catalog.drycc.cc">service-catalog</a>.</p> +<h2 id="storage-requirements">Storage Requirements<a class="td-heading-self-link" href="#storage-requirements" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>Drycc Workflow ships with drycc storage by default, which provides in-cluster.</p> +<p>Workflow supports Amazon Simple Storage Service (S3), Google Cloud Storage (GCS), OpenShift Swift, and Azure Blob +Storage. See <a href="/docs/installing-workflow/configuring-object-storage/">configuring object storage</a> for setup instructions.</p> +<h2 id="resource-requirements">Resource Requirements<a class="td-heading-self-link" href="#resource-requirements" aria-label="Heading self-link"></a></h2> +<p>When deploying Drycc Workflow, it&rsquo;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.</p> +<p>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:</p> +<ul> +<li>At least 4GB of RAM (more is better)</li> +<li>At least 40GB of hard disk space</li> +</ul> +<p>Note that these estimates are for Drycc Workflow and Kubernetes only. Be sure to leave enough spare capacity for your +application footprint as well.</p> +<p>Running smaller machines will likely result in increased system load and has been known to result in component failures +and instability.</p> + + + + + + Docs: Specify Gateway + /docs/installing-workflow/gateway/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/installing-workflow/gateway/ + + + + <h2 id="install-drycc-workflow-specify-gateway">Install Drycc Workflow (Specify gateway)<a class="td-heading-self-link" href="#install-drycc-workflow-specify-gateway" aria-label="Heading self-link"></a></h2> +<p>Now that Helm is installed and the repository has been added, install Workflow with a native gateway by running:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Of course, if you deploy it on a bare machine, you probably do not have Load Balancer. You need to use NodePort:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>If you want to use Load Balancer on a bare machine, you can look at <a href="https://github.com/metallb/metallb">metallb</a></p> +<p>Where <code>global.platformDomain</code> is a <strong>required</strong> parameter that is traditionally not required for Workflow that is explained in the next section. In this example we are using <code>drycc.cc</code> for <code>$hostname</code>.</p> +<p>Helm will install a variety of Kubernetes resources in the <code>drycc</code> namespace. +Wait for the pods that Helm launched to be ready. Monitor their status by running:</p> +<pre tabindex="0"><code>$ kubectl --namespace=drycc get pods +</code></pre><p>You should also notice that several Kubernetes gatewayclass has been installed on your cluster. You can view it by running:</p> +<pre tabindex="0"><code>$ kubectl get gatewayclass --namespace drycc +</code></pre><p>Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the +installation: if a component&rsquo;s dependencies are not yet available, that component will exit and Kubernetes will +automatically restart it.</p> +<p>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:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="install-a-kubernetes-gateway">Install a Kubernetes Gateway<a class="td-heading-self-link" href="#install-a-kubernetes-gateway" aria-label="Heading self-link"></a></h2> +<p>Now that Workflow has been deployed with the <code>global.gatewayClass</code> , we will need a Kubernetes gateway in place to begin routing traffic.</p> +<p>Here is an example of how to use <a href="https://istio.io/">istio</a> as an gateway for Workflow. Of course, you are welcome to use any controller you wish.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h2 id="configure-dns">Configure DNS<a class="td-heading-self-link" href="#configure-dns" aria-label="Heading self-link"></a></h2> +<p>User must install <a href="/docs/quickstart/install-workflow/">drycc</a> and then set up a hostname, and assumes the <code>*.$host</code> convention.</p> +<p>We need to point the <code>*.$host</code> 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.</p> +<pre tabindex="0"><code>$ kubectl get gateway --namespace drycc +NAME CLASS ADDRESS PROGRAMMED AGE +gateway istio 138.91.243.152 True 36d +</code></pre><p>If we were using <code>drycc.cc</code> as a hostname, we would need to create the following A DNS records.</p> +<table> +<thead> +<tr> +<th>Name</th> +<th style="text-align:center">Type</th> +<th style="text-align:right">Value</th> +</tr> +</thead> +<tbody> +<tr> +<td>*.drycc.cc</td> +<td style="text-align:center">A</td> +<td style="text-align:right">138.91.243.152</td> +</tr> +</tbody> +</table> +<p>Once all of the pods are in the <code>READY</code> state, and <code>*.$host</code> resolves to the external IP found above, the preparation of gateway has been completed!</p> +<p>After installing Workflow, <a href="/docs/quickstart/deploy-an-app/">register a user and deploy an application</a>.</p> +<p>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 <code>80</code> and <code>443</code>.</p> + + + + + + Docs: Installing Drycc Workflow + /docs/installing-workflow/workflow/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/installing-workflow/workflow/ + + + + <p>If help is required getting started with Kubernetes and +Drycc Workflow, follow the <a href="/docs/quickstart/">quickstart guide</a> for assistance.</p> +<h2 id="prerequisites">Prerequisites<a class="td-heading-self-link" href="#prerequisites" aria-label="Heading self-link"></a></h2> +<ol> +<li>Verify the <a href="/docs/installing-workflow/system-requirements/">Kubernetes system requirements</a></li> +<li>Install <a href="/docs/quickstart/install-cli-tools/">Helm and Drycc Workflow CLI</a> tools</li> +</ol> +<h2 id="check-your-setup">Check Your Setup<a class="td-heading-self-link" href="#check-your-setup" aria-label="Heading self-link"></a></h2> +<p>Check that the <code>helm</code> command is available and the version is v2.5.0 or newer.</p> +<pre tabindex="0"><code>$ helm version +Client: &amp;version.Version{SemVer:&#34;v2.5.0&#34;, GitCommit:&#34;012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6&#34;, GitTreeState:&#34;clean&#34;} +Server: &amp;version.Version{SemVer:&#34;v2.5.0&#34;, GitCommit:&#34;012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6&#34;, GitTreeState:&#34;clean&#34;} +</code></pre><h2 id="choose-your-deployment-strategy">Choose Your Deployment Strategy<a class="td-heading-self-link" href="#choose-your-deployment-strategy" aria-label="Heading self-link"></a></h2> +<p>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 <a href="/docs/installing-workflow/configuring-object-storage/">configuring object +storage</a> for more details.</p> +<p>More rigorous installations would benefit from using outside sources for the following things:</p> +<ul> +<li><a href="/docs/installing-workflow/configuring-postgres/">Postgres</a> - For example AWS RDS.</li> +<li><a href="/docs/installing-workflow/configuring-registry/">Registry</a> - This includes <a href="https://quay.io">quay.io</a>, <a href="https://hub.docker.com">dockerhub</a>, <a href="https://aws.amazon.com/ecr/">Amazon ECR</a>, and <a href="https://cloud.google.com/container-registry/">Google GCR</a>.</li> +<li><a href="/docs/managing-workflow/platform-logging/#configuring-off-cluster-redis">Redis</a> - Such as AWS Elasticache</li> +<li><a href="/docs/managing-workflow/platform-monitoring/#off-cluster-grafana">Grafana</a></li> +</ul> +<h4 id="gateway">Gateway<a class="td-heading-self-link" href="#gateway" aria-label="Heading self-link"></a></h4> +<p>Now, workflow requires that gateway and cert-manager must be installed. Any compatible Kubernetes entry controller can be used.</p> +<h2 id="install-drycc-workflow">Install Drycc Workflow<a class="td-heading-self-link" href="#install-drycc-workflow" aria-label="Heading self-link"></a></h2> +<p>If the version of helm is 3.0 +; you need to create the namespace in advance:</p> +<pre tabindex="0"><code>kubectl create ns drycc +</code></pre><p>If you want to change it, set the variable when using helm.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Helm will install a variety of Kubernetes resources in the <code>drycc</code> namespace. +Wait for the pods that Helm launched to be ready. Monitor their status by running:</p> +<pre tabindex="0"><code>$ kubectl --namespace=drycc get pods +</code></pre><p>If it&rsquo;s preferred to have <code>kubectl</code> automatically update as the pod states change, run (type Ctrl-C to stop the watch):</p> +<pre tabindex="0"><code>$ kubectl --namespace=drycc get pods -w +</code></pre><p>Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the +installation: if a component&rsquo;s dependencies are not yet available, that component will exit and Kubernetes will +automatically restart it.</p> +<p>Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Once all of the pods are in the <code>READY</code> state, Drycc Workflow is up and running!</p> +<p>For more installation parameters, please check the <a href="https://github.com/drycc/workflow/blob/main/charts/workflow/values.yaml">values.yaml</a> file of workflow.</p> +<p>After installing Workflow, <a href="/docs/quickstart/deploy-an-app/">register a user and deploy an application</a>.</p> +<h2 id="configure-dns">Configure DNS<a class="td-heading-self-link" href="#configure-dns" aria-label="Heading self-link"></a></h2> +<p>User must to set up a hostname, and assumes the <code>drycc-builder.$host</code> convention.</p> +<p>We need to point the <code>drycc-builder.$host</code> 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.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>If we were using <code>drycc.cc</code> as a hostname, we would need to create the following A DNS records.</p> +<table> +<thead> +<tr> +<th>Name</th> +<th style="text-align:center">Type</th> +<th style="text-align:right">Value</th> +</tr> +</thead> +<tbody> +<tr> +<td>drycc-builder.drycc.cc</td> +<td style="text-align:center">A</td> +<td style="text-align:right">138.91.243.152</td> +</tr> +</tbody> +</table> +<p>Once all of the pods are in the <code>READY</code> state, and <code>drycc-builder.$host</code> resolves to the external IP found above, Workflow is up and running!</p> +<p>After installing Workflow, <a href="/docs/quickstart/deploy-an-app/">register a user and deploy an application</a>.</p> +<p>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 <code>80</code> and <code>443</code>.</p> + + + + + + Docs: Configuring Object Storage + /docs/installing-workflow/configuring-object-storage/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/installing-workflow/configuring-object-storage/ + + + + <p>Drycc Workflow ships with <a href="/docs/understanding-workflow/components/#object-storage">Storage</a> by default, which provides in-cluster.</p> +<h2 id="configuring-off-cluster-object-storage">Configuring off-cluster Object Storage<a class="td-heading-self-link" href="#configuring-off-cluster-object-storage" aria-label="Heading self-link"></a></h2> +<p>Every component that relies on object storage uses two inputs for configuration:</p> +<ol> +<li>You must use object storage services that are compatible with S3 API</li> +<li>Access credentials stored as a Kubernetes secret named <code>storage-creds</code></li> +</ol> +<p>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, <a href="https://azure.microsoft.com/en-us/services/storage/blobs/">Azure Blob Storage</a> and OpenStack Swift Storage.</p> +<h3 id="step-1-create-storage-buckets">Step 1: Create storage buckets<a class="td-heading-self-link" href="#step-1-create-storage-buckets" aria-label="Heading self-link"></a></h3> +<p>Create storage buckets for each of the Workflow subsystems: <code>builder</code>, <code>registry</code>, and <code>database</code>.</p> +<p>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 <a href="https://forums.aws.amazon.com/thread.jspa?threadID=105357">ssl certificate validation issue with S3</a>.</p> +<p>If you provide credentials with sufficient access to the underlying storage, Workflow components will create the buckets if they do not exist.</p> +<h3 id="step-2-generate-storage-credentials">Step 2: Generate storage credentials<a class="td-heading-self-link" href="#step-2-generate-storage-credentials" aria-label="Heading self-link"></a></h3> +<p>If applicable, generate credentials that have create and write access to the storage buckets created in Step 1.</p> +<p>If you are using AWS S3 and your Kubernetes nodes are configured with appropriate <a href="http://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html">IAM</a> 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!</p> +<h3 id="step-3-configure-workflow-chart">Step 3: Configure Workflow Chart<a class="td-heading-self-link" href="#step-3-configure-workflow-chart" aria-label="Heading self-link"></a></h3> +<p>Operators should configure object storage by editing the Helm values file before running <code>helm install</code>. To do so:</p> +<ul> +<li>Fetch the Helm values by running <code>helm inspect values oci://registry.drycc.cc/charts/workflow &gt; values.yaml</code></li> +<li>Update the <code>global/storage</code> parameter to reference the platform you are using, e.g. <code>s3</code>, <code>azure</code>, <code>gcs</code>, or <code>swift</code></li> +<li>Find the corresponding section for your storage type and provide appropriate values including region, bucket names, and access credentials.</li> +<li>Save your changes.</li> +</ul> +<p>!!! note +All values will be automatically (base64) encoded <em>except</em> the <code>key_json</code> values under <code>gcs</code>/<code>gcr</code>. These must be base64-encoded. This is to support cleanly passing said encoded text via <code>helm --set</code> cli functionality rather than attempting to pass the raw JSON data. For example:</p> +<pre><code> $ helm install drycc oci://registry.drycc.cc/charts/workflow \ + --namespace drycc \ + --set global.platformDomain=youdomain.com + --set global.storage=gcs,gcs.key_json=&quot;$(cat /path/to/gcs_creds.json | base64 -w 0)&quot; +</code></pre> +<p>You are now ready to run <code>helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml</code> using your desired object storage.</p> + + + + + + Docs: Configuring Postgres + /docs/installing-workflow/configuring-postgres/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/installing-workflow/configuring-postgres/ + + + + <h1 id="configuring-postgres">Configuring Postgres<a class="td-heading-self-link" href="#configuring-postgres" aria-label="Heading self-link"></a></h1> +<p>By default, Drycc Workflow ships with the <a href="/docs/understanding-workflow/components/#database">database</a> component, which provides an in-cluster PostgreSQL database backed up to in-cluster or off-cluster <a href="/docs/installing-workflow/configuring-object-storage/">object storage</a>. Currently, for object storage, which is utilized by <em>several</em> 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.</p> +<h2 id="provisioning-off-cluster-postgres">Provisioning off-cluster Postgres<a class="td-heading-self-link" href="#provisioning-off-cluster-postgres" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>Take note of the following:</p> +<ol> +<li>The hostname or public IP of your PostgreSQL RDBMS</li> +<li>The port on which your PostgreSQL RDBMS runs&ndash; typically 5432</li> +</ol> +<p>Within the off-cluster RDBMS, manually provision the following:</p> +<ol> +<li>A database user (take note of the username and password)</li> +<li>A database owned by that user (take note of its name)</li> +</ol> +<p>If you are able to log into the RDBMS as a superuser or a user with appropriate permissions, this process will <em>typically</em> look like this:</p> +<pre tabindex="0"><code>$ psql -h &lt;host&gt; -p &lt;port&gt; -d postgres -U &lt;&#34;postgres&#34; or your own username&gt; +&gt; create user &lt;drycc username; typically &#34;drycc&#34;&gt; with password &#39;&lt;password&gt;&#39;; +&gt; create database &lt;database name; typically &#34;drycc&#34;&gt; with owner &lt;drycc username&gt;; +&gt; \q +</code></pre><h2 id="configuring-workflow">Configuring Workflow<a class="td-heading-self-link" href="#configuring-workflow" aria-label="Heading self-link"></a></h2> +<p>The Helm chart for Drycc Workflow can be easily configured to connect the Workflow controller component to an off-cluster PostgreSQL database.</p> +<ul> +<li><strong>Step 1:</strong> If you haven&rsquo;t already fetched the values, do so with <code>helm inspect values drycc/workflow &gt; values.yaml</code></li> +<li><strong>Step 2:</strong> Update database connection details by modifying <code>values.yaml</code>: +<ul> +<li>Update the <code>databaseLocation</code> parameter to <code>off-cluster</code>.</li> +<li>Update the values in the <code>[database]</code> configuration section to properly reflect all connection details.</li> +<li>Update the values in the <code>[controller]</code> configuration section to properly reflect platformDomain details.</li> +<li>Save your changes.</li> +<li>Note: you do not need to (and must not) base64 encode any values, as the Helm chart will automatically handle encoding as necessary.</li> +</ul> +</li> +</ul> +<p>You are now ready to <code>helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml</code> <a href="/docs/installing-workflow/">as usual</a>.</p> + + + + + + Docs: Configuring Registry + /docs/installing-workflow/configuring-registry/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/installing-workflow/configuring-registry/ + + + + <p>Drycc Workflow ships with a <a href="/docs/understanding-workflow/components/#registry">registry</a> component by default, which provides an in-cluster Container registry backed by the platform-configured <a href="/docs/installing-workflow/configuring-object-storage/">object storage</a>. Operators might want to use an off-cluster registry for performance or security reasons.</p> +<h2 id="configuring-off-cluster-private-registry">Configuring Off-Cluster Private Registry<a class="td-heading-self-link" href="#configuring-off-cluster-private-registry" aria-label="Heading self-link"></a></h2> +<p>Every component that relies on a registry uses two inputs for configuration:</p> +<ol> +<li>Registry Location environment variable named <code>DRYCC_REGISTRY_LOCATION</code></li> +<li>Access credentials stored as a Kubernetes secret named <code>registry-secret</code></li> +</ol> +<p>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.</p> +<p>When using a private registry the container images are no longer pulled by Drycc Workflow Controller but rather are managed by <a href="https://kubernetes.io">Kubernetes</a>. This will increase security and overall speed, however the <code>port</code> information can no longer be discovered. Instead the <code>port</code> information can be set via <code>drycc config:set PORT=&lt;port&gt;</code> prior to deploying the application.</p> +<p>Drycc Workflow currently supports:</p> +<ol> +<li>off-cluster: Any provider which supports long-lived username/password authentication, such as <a href="https://docs.microsoft.com/en-us/azure/container-registry/">Azure Container Registry</a>, <a href="https://hub.docker.com/">Docker Hub</a>, <a href="https://quay.io/">quay.io</a>, or a self-hosted Container registry.</li> +</ol> +<h2 id="configuration">Configuration<a class="td-heading-self-link" href="#configuration" aria-label="Heading self-link"></a></h2> +<ol> +<li>If you haven&rsquo;t already fetched the values file, do so with <code>helm inspect values drycc/workflow &gt; values.yaml</code></li> +<li>Update registry location details by modifying the values file: +* Update the <code>registryLocation</code> parameter to reference the registry location you are using: <code>off-cluster</code>, <code>ecr</code>, <code>gcr</code> +* Update the values in the section which corresponds to your registry location type.</li> +</ol> +<p>You are now ready to <code>helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml</code> using your desired registry.</p> +<h2 id="examples">Examples<a class="td-heading-self-link" href="#examples" aria-label="Heading self-link"></a></h2> +<p>Here we show how the relevant parts of the fetched <code>values.yaml</code> file might look like after configuring for a particular off-cluster registry:</p> +<h3 id="azure-container-registryhttpsazuremicrosoftcomen-usservicescontainer-registry-acr"><a href="https://azure.microsoft.com/en-us/services/container-registry/">Azure Container Registry</a> (ACR)<a class="td-heading-self-link" href="#azure-container-registryhttpsazuremicrosoftcomen-usservicescontainer-registry-acr" aria-label="Heading self-link"></a></h3> +<p>After following the <a href="https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-azure-cli">docs</a> and creating a registry, e.g. <code>myregistry</code>, with its corresponding login server of <code>myregistry.azurecr.io</code>, the following values should be supplied:</p> +<pre tabindex="0"><code>global: +... + registryLocation: &#34;off-cluster&#34; +... +registry-token-refresher: +... + registry: + hostname: &#34;myregistry.azurecr.io&#34; + organization: &#34;myorg&#34; + username: &#34;myusername&#34; + password: &#34;mypassword&#34; +... +</code></pre><p><strong>Note:</strong> The mandatory organization field (here <code>myorg</code>) will be created as an ACR repository if it does not already exist.</p> +<h3 id="quayio">Quay.io<a class="td-heading-self-link" href="#quayio" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>global: +... + registryLocation: &#34;off-cluster&#34; +... +registry-token-refresher: +... + registry: + hostname: &#34;quay.io&#34; + organization: &#34;myorg&#34; + username: &#34;myusername&#34; + password: &#34;mypassword&#34; +... +</code></pre> + + + + + diff --git a/docs/installing-workflow/system-requirements/index.html b/docs/installing-workflow/system-requirements/index.html new file mode 100644 index 000000000..76a969677 --- /dev/null +++ b/docs/installing-workflow/system-requirements/index.html @@ -0,0 +1,491 @@ + + + + + + + + + + + + + + + + + + + +Requirements | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Requirements

+
To run Drycc Workflow on a Kubernetes cluster, there are a few requirements to keep in mind.
+ +

Kubernetes Versions

+

Drycc Workflow requires Kubernetes v1.16.15 or later.

+

Components Requirements

+

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.

+

Storage Requirements

+

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.

+

Resource Requirements

+

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:

+
    +
  • At least 4GB of RAM (more is better)
  • +
  • At least 40GB of hard disk space
  • +
+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/installing-workflow/workflow/index.html b/docs/installing-workflow/workflow/index.html new file mode 100644 index 000000000..cbbfff22e --- /dev/null +++ b/docs/installing-workflow/workflow/index.html @@ -0,0 +1,567 @@ + + + + + + + + + + + + + + + + + + + +Installing Drycc Workflow | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Installing Drycc Workflow

+
This document is aimed at those who have already provisioned a Kubernetes cluster and want to install Drycc Workflow.
+ +

If help is required getting started with Kubernetes and +Drycc Workflow, follow the quickstart guide for assistance.

+

Prerequisites

+
    +
  1. Verify the Kubernetes system requirements
  2. +
  3. Install Helm and Drycc Workflow CLI tools
  4. +
+

Check Your Setup

+

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"}
+

Choose Your Deployment Strategy

+

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:

+ +

Gateway

+

Now, workflow requires that gateway and cert-manager must be installed. Any compatible Kubernetes entry controller can be used.

+

Install Drycc Workflow

+

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.

+

Configure DNS

+

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.

+ + + + + + + + + + + + + + + +
NameTypeValue
drycc-builder.drycc.ccA138.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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/managing-workflow/_print/index.html b/docs/managing-workflow/_print/index.html new file mode 100644 index 000000000..aac115cf9 --- /dev/null +++ b/docs/managing-workflow/_print/index.html @@ -0,0 +1,1037 @@ + + + + + + + + + + + + + + + + + + + + + +Managing Workflow | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Managing Workflow

+
Managing Workflow using the kubectl.
+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + +
+ +

1 - Tuning Component Settings

+
Helm Charts are a set of Kubernetes manifests that reflect best practices for deploying an application or service on Kubernetes.
+

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.

    +
  • +
+

Setting Resource limits

+

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"
+

Customizing the Builder

+

The following environment variables are tunable for the Builder component:

+ + + + + + + + + + + + + + + + + +
SettingDescription
DEBUGEnable debug log output (default: false)
BUILDER_POD_NODE_SELECTORA 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
+

Customizing the Controller

+

The following environment variables are tunable for the Controller component:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
REGISTRATION_MODEset registration to “enabled”, “disabled”, or “admin_only” (default: “admin_only”)
GUNICORN_WORKERSnumber of gunicorn workers spawned to process requests (default: CPU cores * 4 + 1)
RESERVED_NAMESa comma-separated list of names which applications cannot reserve for routing (default: “drycc, drycc-builder”)
DRYCC_DEPLOY_HOOK_URLSa comma-separated list of URLs to send deploy hooks to.
DRYCC_DEPLOY_HOOK_SECRET_KEYa private key used to compute the HMAC signature for deploy hooks.
DRYCC_DEPLOY_REJECT_IF_PROCFILE_MISSINGrejects 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_REMOVEwhen 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_TAGSset tags for all applications by default, for example: ‘{“role”: “worker”}’. (default: ‘’)
KUBERNETES_NAMESPACE_DEFAULT_QUOTA_SPECset 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)
+

LDAP authentication settings

+

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:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
LDAP_ENDPOINTThe URI of the LDAP server. If not specified, LDAP authentication is not enabled (default: “”, example: ldap://hostname).
LDAP_BIND_DNThe distinguished name to use when binding to the LDAP server (default: “”)
LDAP_BIND_PASSWORDThe password to use with LDAP_BIND_DN (default: “”)
LDAP_USER_BASEDNThe distinguished name of the search base for user names (default: “”)
LDAP_USER_FILTERThe name of the login field in the users search base (default: “username”)
LDAP_GROUP_BASEDNThe distinguished name of the search base for user’s groups names (default: “”)
LDAP_GROUP_FILTERThe filter for user’s groups (default: “”, example: objectClass=person)
+

Global and per application settings

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
DRYCC_DEPLOY_BATCHESthe number of pods to bring up and take down sequentially during a scale (default: number of available nodes)
DRYCC_DEPLOY_TIMEOUTdeploy timeout in seconds per deploy batch (default: 120)
IMAGE_PULL_POLICYthe kubernetes image pull policy for application images (default: “IfNotPresent”) (allowed values: “Always”, “IfNotPresent”)
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIThow many revisions Kubernetes keeps around of a given Deployment (default: all revisions)
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDShow 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.

+

Customizing the Database

+

The following environment variables are tunable for the Database component:

+ + + + + + + + + + + + + + + + + +
SettingDescription
BACKUP_FREQUENCYhow often the database should perform a base backup (default: “12h”)
BACKUPS_TO_RETAINnumber of base backups the backing store should retain (default: 5)
+

Customizing Fluentbit

+

The following values can be changed in the values.yaml file or by using the --values flag with the Helm CLI.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
KeyDescription
config.serviceThe service section defines the global properties of the service.
config.inputsAn input section defines a source (related to an input plugin).
config.filtersA filter section defines a filter (related to a filter plugin)
config.outputsThe 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.

+

Customizing the Logger

+

The following environment variables are tunable for the Logger component:

+ + + + + + + + + + + + + + + + + +
SettingDescription
STORAGE_ADAPTERHow to store logs that are sent to the logger. Legal values are “file”, “memory”, and “redis”. (default: “redis”)
NUMBER_OF_LINESHow many lines to store in the ring buffer (default: 1000)
+

Customizing the Monitor

+

Grafana

+

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:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDefault ValueDescription
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.

+

Telegraf

+

For a list of configuration values that can be set by using environment variables please see the following configuration file.

+

Prometheus

+

You can find a list of values that can be set using environment variables here.

+

Customizing the Registry

+

The Registry component can be tuned by following the +drycc/distribution config doc.

+

Customizing the Router

+

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:

+ + + + + + + + + + + + + +
SettingDescription
POD_NAMESPACEThe pod namespace the router resides in. This is set by the Kubernetes downward API.
+

Customizing Workflow Manager

+

The following environment variables are tunable for [Workflow Manager][]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
CHECK_VERSIONSEnables the external version check at https://versions.drycc.info/ (default: “true”)
POLL_INTERVAL_SECThe interval when Workflow Manager performs a version check, in seconds (default: 43200, or 12 hours)
VERSIONS_API_URLThe versions API URL (default: “https://versions-staging.drycc.info”)
DOCTOR_API_URLThe doctor API URL (default: “https://doctor-staging.drycc.info”)
API_VERSIONThe version number Workflow Manager sends to the versions API (default: “v2”)
+ +
+ + + + + + + + + + + +
+ +

2 - Configure DNS

+
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.
+

For example, assuming example.com were a cluster’s domain:

+
    +
  • The controller should be accessible at drycc.example.com
  • +
  • Applications should be accessible (by default) at <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.

+

With a Load Balancer

+

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:

+
    +
  • An A record enumerating each of your load balancer(s) IPs (i.e. DNS round-robining)
  • +
  • A CNAME record referencing an existing fully-qualified domain name for the load balancer +
      +
    • Per AWS’ own documentation, this is the recommended strategy when using AWS Elastic Load Balancers, as ELB IPs may change over time.
    • +
    +
  • +
+

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.

+

Without a Load Balancer

+

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.

+

Tutorial: Configuring DNS with Google Cloud DNS

+

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:

+
    +
  • Your Ingress service has a load balancer in front of it. +
      +
    • The load balancer need not be cloud based, it just needs to provide a stable IP address or a stable domain name
    • +
    +
  • +
  • You have the mystuff.com domain name registered with a registrar +
      +
    • Replace your domain name with mystuff.com in the instructions to follow
    • +
    +
  • +
  • Your registrar lets you alter the nameservers for your domain name (most registrars do)
  • +
+

Here are the steps for configuring cloud DNS to route to your drycc cluster:

+
    +
  1. Get the load balancer IP or domain name
  2. +
+
    +
  • If you are on Google Container Engine, you can run kubectl get svc -n istio-ingress and look for the LoadBalancer Ingress column to get the IP address
  • +
+
    +
  1. Create a new Cloud DNS Zone (on the console: Networking => Cloud DNS, then click on Create Zone)
  2. +
  3. Name your zone, and set the DNS name to mystuff.com. (note the . at the end
  4. +
  5. Click on the Create button
  6. +
  7. Click on the Add Record Set button on the resulting page
  8. +
  9. If your load balancer provides a stable IP address, enter the following fields in the resulting form:
  10. +
  11. DNS Name: *
  12. +
  13. Resource Record Type: A
  14. +
  15. 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 TTL
  16. +
  17. IPv4 Address: The IP that you got in the very first step
  18. +
  19. Click the Create button
  20. +
  21. If your load balancer provides the stable domain name lbdomain.com, enter the following fields in the resulting form:
  22. +
  23. DNS Name: *
  24. +
  25. Resource Record Type: CNAME
  26. +
  27. 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 TTL
  28. +
  29. Canonical name: lbdomain.com. (note the . a the end)
  30. +
  31. Click on the Create button
  32. +
  33. In your domain registrar, set the nameservers for your mystuff.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).
  34. +
+
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.

+

Testing

+

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."}
+
+
+ + + + + + + + + + + +
+ +

3 - Deploy Hooks

+
Deploy hooks allow an external service to receive a notification whenever a new version of your app is pushed to Workflow.
+

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.

+

HTTP POST Hook

+

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.

+ +
+ + + + + + + + + + + +
+ +

4 - Platform Logging

+
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.
+

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.

+

Configuring Off Cluster 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:

+
    +
  • db = “0”
  • +
  • host = “my.host.redis”
  • +
  • port = “6379”
  • +
  • password = ""
  • +
+

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.

+

Debugging Logger

+

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
+

Architecture Diagram

+
                        ┌────────┐                                        
+                        │ Router │                  ┌────────┐     ┌─────┐
+                        └────────┘                  │ Logger │◀───▶│Redis│
+                            │                       └────────┘     └─────┘
+                        Log file                        ▲                
+                            │                           │                
+                            ▼                           │                
+┌────────┐             ┌─────────┐    logs/metrics   ┌──────────────┐     
+│App Logs│──Log File──▶│Fluentbit│───────topics─────▶│ Redis Stream │     
+└────────┘             └─────────┘                   └──────────────┘     
+                                                                          
+

Default Configuration

+

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.

+ +
+ + + + + + + + + + + +
+ +

5 - Platform Monitoring

+
Platform monitoring to your apps to spot issues in advance and respond to incidents quickly.
+

Description

+

We now include a monitoring stack for introspection on a running Kubernetes cluster. The stack includes 4 components:

+ +

Architecture Diagram

+
┌────────────────┐                                                        
+│ HOST           │                                                        
+│  node-exporter │◀──┐                       ┌──────────────────┐         
+└────────────────┘   │                       │kube-state-metrics│         
+                     │                       └──────────────────┘         
+┌────────────────┐   │                               ▲                    
+│ HOST           │   │    ┌────────────┐             │                    
+│  node-exporter │◀──┼────│ Prometheus │─────────────┘                    
+└────────────────┘   │    └────────────┘                                  
+                     │          ▲                                         
+┌───────────────┐    │          │                                         
+│ HOST          │    │          ▼                                         
+│  node-exporter│◀───┘    ┌──────────┐                                    
+└───────────────┘         │ Grafana  │                                    
+                          └──────────┘                                    
+

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.

+

Production Configuration

+

A production install of Grafana should have the following configuration values changed if possible:

+
    +
  • Change the default username and password from 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.
  • +
  • Enable persistence
  • +
  • Use a supported external database such as mysql or postgres. You can find more information here
  • +
+

On Cluster Persistence

+

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
+

Off Cluster Grafana

+

If you wish to provide your own Grafana instance you can set grafanaLocation in the values.yaml file before running helm install.

+

Prometheus

+

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.

+

On Cluster Persistence

+

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
+

Off Cluster Prometheus

+

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"
  • +
+ +
+ + + + + + + + + + + +
+ +

6 - Production Deployments

+
When readying a Workflow deployment for production workloads, there are some additional recommendations.
+

Running Workflow without drycc storage

+

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:

+
    +
  • Removal of state from the worker nodes
  • +
  • Reduced resource usage
  • +
  • Reduced complexity and operational burden of managing Workflow
  • +
+

See Configuring Object Storage for details on removing this operational complexity.

+

Review Security Considerations

+

There are some additional security-related considerations when running Workflow in production. +See [Security Considerations][] for details.

+

Registration is Admin-Only

+

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:

+ +

Disable Grafana Signups

+

It is also recommended to disable signups for the Grafana dashboards.

+

Please see the following documentation to learn about disabling Grafana signups:

+ +

Running Workflow with RBAC

+

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:

+
    +
  • your Kubernetes cluster is in GKE
  • +
  • your Kubernetes cluster built with kubeadm
  • +
+

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.

+ +
+ + + + + + + + + + + +
+ +

7 - Upgrading Workflow

+
Drycc Workflow releases may be upgraded in-place with minimal downtime.
+

This upgrade process requires:

+ +

Upgrade Process

+

!!! 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.

+

Step 1: Apply the Workflow upgrade

+

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.

+

Step 2: Verify Upgrade

+

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
+

Step 3: Upgrade the Drycc Client

+

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)
+
+
+ + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/docs/managing-workflow/configuring-dns/index.html b/docs/managing-workflow/configuring-dns/index.html new file mode 100644 index 000000000..233dca8e5 --- /dev/null +++ b/docs/managing-workflow/configuring-dns/index.html @@ -0,0 +1,554 @@ + + + + + + + + + + + + + + + + + + + +Configure DNS | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Configure DNS

+
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.
+ +

For example, assuming example.com were a cluster’s domain:

+
    +
  • The controller should be accessible at drycc.example.com
  • +
  • Applications should be accessible (by default) at <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.

+

With a Load Balancer

+

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:

+
    +
  • An A record enumerating each of your load balancer(s) IPs (i.e. DNS round-robining)
  • +
  • A CNAME record referencing an existing fully-qualified domain name for the load balancer +
      +
    • Per AWS’ own documentation, this is the recommended strategy when using AWS Elastic Load Balancers, as ELB IPs may change over time.
    • +
    +
  • +
+

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.

+

Without a Load Balancer

+

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.

+

Tutorial: Configuring DNS with Google Cloud DNS

+

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:

+
    +
  • Your Ingress service has a load balancer in front of it. +
      +
    • The load balancer need not be cloud based, it just needs to provide a stable IP address or a stable domain name
    • +
    +
  • +
  • You have the mystuff.com domain name registered with a registrar +
      +
    • Replace your domain name with mystuff.com in the instructions to follow
    • +
    +
  • +
  • Your registrar lets you alter the nameservers for your domain name (most registrars do)
  • +
+

Here are the steps for configuring cloud DNS to route to your drycc cluster:

+
    +
  1. Get the load balancer IP or domain name
  2. +
+
    +
  • If you are on Google Container Engine, you can run kubectl get svc -n istio-ingress and look for the LoadBalancer Ingress column to get the IP address
  • +
+
    +
  1. Create a new Cloud DNS Zone (on the console: Networking => Cloud DNS, then click on Create Zone)
  2. +
  3. Name your zone, and set the DNS name to mystuff.com. (note the . at the end
  4. +
  5. Click on the Create button
  6. +
  7. Click on the Add Record Set button on the resulting page
  8. +
  9. If your load balancer provides a stable IP address, enter the following fields in the resulting form:
  10. +
  11. DNS Name: *
  12. +
  13. Resource Record Type: A
  14. +
  15. 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 TTL
  16. +
  17. IPv4 Address: The IP that you got in the very first step
  18. +
  19. Click the Create button
  20. +
  21. If your load balancer provides the stable domain name lbdomain.com, enter the following fields in the resulting form:
  22. +
  23. DNS Name: *
  24. +
  25. Resource Record Type: CNAME
  26. +
  27. 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 TTL
  28. +
  29. Canonical name: lbdomain.com. (note the . a the end)
  30. +
  31. Click on the Create button
  32. +
  33. In your domain registrar, set the nameservers for your mystuff.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).
  34. +
+
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.

+

Testing

+

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."}
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/managing-workflow/deploy-hooks/index.html b/docs/managing-workflow/deploy-hooks/index.html new file mode 100644 index 000000000..8fe52e4b6 --- /dev/null +++ b/docs/managing-workflow/deploy-hooks/index.html @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + +Deploy Hooks | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Deploy Hooks

+
Deploy hooks allow an external service to receive a notification whenever a new version of your app is pushed to Workflow.
+ +

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.

+

HTTP POST Hook

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/managing-workflow/index.html b/docs/managing-workflow/index.html new file mode 100644 index 000000000..c6d16c71a --- /dev/null +++ b/docs/managing-workflow/index.html @@ -0,0 +1,496 @@ + + + + + + + + + + + + + + + + + + + + + +Managing Workflow | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Managing Workflow

+
Managing Workflow using the kubectl.
+ + +
+ + +
+
+
+ Tuning Component Settings +
+

Helm Charts are a set of Kubernetes manifests that reflect best practices for deploying an application or service on Kubernetes.

+
+
+
+ Configure DNS +
+

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 +
+

Deploy hooks allow an external service to receive a notification whenever a new version of your app is pushed to Workflow.

+
+
+
+ Platform Logging +
+

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 +
+

Platform monitoring to your apps to spot issues in advance and respond to incidents quickly.

+
+
+
+ Production Deployments +
+

When readying a Workflow deployment for production workloads, there are some additional recommendations.

+
+
+
+ Upgrading Workflow +
+

Drycc Workflow releases may be upgraded in-place with minimal downtime.

+
+
+ +
+ + + + + + +
+ +
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/managing-workflow/index.xml b/docs/managing-workflow/index.xml new file mode 100644 index 000000000..9fdc21f42 --- /dev/null +++ b/docs/managing-workflow/index.xml @@ -0,0 +1,766 @@ + + + Drycc – Managing Workflow + /docs/managing-workflow/ + Recent content in Managing Workflow on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Docs: Tuning Component Settings + /docs/managing-workflow/tuning-component-settings/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/tuning-component-settings/ + + + + <p>After you add the Drycc Chart Repository, you can customize the chart using +<code>helm inspect values drycc/workflow &gt; values.yaml</code> before using <code>helm install</code> to complete the +installation.</p> +<p>There are a few ways to customize the respective component:</p> +<ul> +<li> +<p>If the value is exposed in the <code>values.yaml</code> 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:</p> +<pre><code> $ 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 +</code></pre> +</li> +<li> +<p>If the value hasn&rsquo;t yet been exposed in the <code>values.yaml</code> file, one may edit the component deployment with the tuned setting. Here we edit the <code>drycc-controller</code> deployment:</p> +<pre><code> $ kubectl --namespace drycc edit deployment drycc-controller +</code></pre> +<p>Add/edit the setting via the appropriate environment variable and value under the <code>env</code> section and save. The updated deployment will recreate the component pod with the new/modified setting.</p> +</li> +<li> +<p>Lastly, one may also fetch and edit the chart as served by version control/the chart repository itself:</p> +<pre><code> $ helm fetch oci://registry.drycc.cc/charts/workflow --untar + $ $EDITOR workflow/charts/controller/templates/controller-deployment.yaml +</code></pre> +<p>Then run <code>helm install ./workflow --namespace drycc --name drycc</code> to apply the changes, or <code>helm upgrade drycc ./workflow</code> if the cluster is already running.</p> +</li> +</ul> +<h2 id="setting-resource-limits">Setting Resource limits<a class="td-heading-self-link" href="#setting-resource-limits" aria-label="Heading self-link"></a></h2> +<p>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 <code>limitsCpu</code>, <code>limitsMemory</code> in the section and set them to the appropriate +values.</p> +<p>Below is an example of how the builder section of <code>values.yaml</code> might look with CPU and memory +limits set:</p> +<pre tabindex="0"><code>builder: + imageOrg: &#34;drycc&#34; + imagePullPolicy: &#34;Always&#34; + imageTag: &#34;canary&#34; + limitsCpu: &#34;100m&#34; + limitsMemory: &#34;50Mi&#34; +</code></pre><h2 id="customizing-the-builder">Customizing the Builder<a class="td-heading-self-link" href="#customizing-the-builder" aria-label="Heading self-link"></a></h2> +<p>The following environment variables are tunable for the <a href="/docs/understanding-workflow/components/#builder">Builder</a> component:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>DEBUG</td> +<td>Enable debug log output (default: false)</td> +</tr> +<tr> +<td>BUILDER_POD_NODE_SELECTOR</td> +<td>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&rsquo;t affect critical nodes. for example <code>pool:testing,disk:magnetic</code></td> +</tr> +</tbody> +</table> +<h2 id="customizing-the-controller">Customizing the Controller<a class="td-heading-self-link" href="#customizing-the-controller" aria-label="Heading self-link"></a></h2> +<p>The following environment variables are tunable for the <a href="/docs/understanding-workflow/components/#controller">Controller</a> component:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>REGISTRATION_MODE</td> +<td>set registration to &ldquo;enabled&rdquo;, &ldquo;disabled&rdquo;, or &ldquo;admin_only&rdquo; (default: &ldquo;admin_only&rdquo;)</td> +</tr> +<tr> +<td>GUNICORN_WORKERS</td> +<td>number of <a href="http://gunicorn.org/">gunicorn</a> workers spawned to process requests (default: CPU cores * 4 + 1)</td> +</tr> +<tr> +<td>RESERVED_NAMES</td> +<td>a comma-separated list of names which applications cannot reserve for routing (default: &ldquo;drycc, drycc-builder&rdquo;)</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_HOOK_URLS</td> +<td>a comma-separated list of URLs to send <a href="/docs/managing-workflow/deploy-hooks/#http-post-hook">deploy hooks</a> to.</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_HOOK_SECRET_KEY</td> +<td>a private key used to compute the HMAC signature for deploy hooks.</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_REJECT_IF_PROCFILE_MISSING</td> +<td>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: &ldquo;false&rdquo;, allowed values: &ldquo;true&rdquo;, &ldquo;false&rdquo;)</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_PROCFILE_MISSING_REMOVE</td> +<td>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: &ldquo;true&rdquo;, allowed values: &ldquo;true&rdquo;, &ldquo;false&rdquo;)</td> +</tr> +<tr> +<td>DRYCC_DEFAULT_CONFIG_TAGS</td> +<td>set tags for all applications by default, for example: &lsquo;{&ldquo;role&rdquo;: &ldquo;worker&rdquo;}&rsquo;. (default: &lsquo;&rsquo;)</td> +</tr> +<tr> +<td>KUBERNETES_NAMESPACE_DEFAULT_QUOTA_SPEC</td> +<td>set resource quota to application namespace by setting <a href="http://kubernetes.io/docs/admin/resourcequota/">ResourceQuota</a> spec, for example: <code>{&quot;spec&quot;:{&quot;hard&quot;:{&quot;pods&quot;:&quot;10&quot;}}}</code>, restrict app owner to spawn more then 10 pods (default: &ldquo;&rdquo;, no quota will be applied to namespace)</td> +</tr> +</tbody> +</table> +<h3 id="ldap-authentication-settings">LDAP authentication settings<a class="td-heading-self-link" href="#ldap-authentication-settings" aria-label="Heading self-link"></a></h3> +<p>Configuration options for LDAP authentication are detailed <a href="https://pythonhosted.org/django-auth-ldap/reference.html">here</a>.</p> +<p>The following environment variables are available for enabling LDAP +authentication of user accounts in the <a href="/docs/understanding-workflow/components/#passport">Passport</a> component:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>LDAP_ENDPOINT</td> +<td>The URI of the LDAP server. If not specified, LDAP authentication is not enabled (default: &ldquo;&rdquo;, example: <code>ldap://hostname</code>).</td> +</tr> +<tr> +<td>LDAP_BIND_DN</td> +<td>The distinguished name to use when binding to the LDAP server (default: &ldquo;&rdquo;)</td> +</tr> +<tr> +<td>LDAP_BIND_PASSWORD</td> +<td>The password to use with LDAP_BIND_DN (default: &ldquo;&rdquo;)</td> +</tr> +<tr> +<td>LDAP_USER_BASEDN</td> +<td>The distinguished name of the search base for user names (default: &ldquo;&rdquo;)</td> +</tr> +<tr> +<td>LDAP_USER_FILTER</td> +<td>The name of the login field in the users search base (default: &ldquo;username&rdquo;)</td> +</tr> +<tr> +<td>LDAP_GROUP_BASEDN</td> +<td>The distinguished name of the search base for user&rsquo;s groups names (default: &ldquo;&rdquo;)</td> +</tr> +<tr> +<td>LDAP_GROUP_FILTER</td> +<td>The filter for user&rsquo;s groups (default: &ldquo;&rdquo;, example: <code>objectClass=person</code>)</td> +</tr> +</tbody> +</table> +<h3 id="global-and-per-application-settings">Global and per application settings<a class="td-heading-self-link" href="#global-and-per-application-settings" aria-label="Heading self-link"></a></h3> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>DRYCC_DEPLOY_BATCHES</td> +<td>the number of pods to bring up and take down sequentially during a scale (default: number of available nodes)</td> +</tr> +<tr> +<td>DRYCC_DEPLOY_TIMEOUT</td> +<td>deploy timeout in seconds per deploy batch (default: 120)</td> +</tr> +<tr> +<td>IMAGE_PULL_POLICY</td> +<td>the kubernetes <a href="http://kubernetes.io/docs/user-guide/images/">image pull policy</a> for application images (default: &ldquo;IfNotPresent&rdquo;) (allowed values: &ldquo;Always&rdquo;, &ldquo;IfNotPresent&rdquo;)</td> +</tr> +<tr> +<td>KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT</td> +<td>how many <a href="http://kubernetes.io/docs/user-guide/deployments/#revision-history-limit">revisions</a> Kubernetes keeps around of a given Deployment (default: all revisions)</td> +</tr> +<tr> +<td>KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS</td> +<td>how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30)</td> +</tr> +</tbody> +</table> +<p>See the <a href="/docs/applications/deploying-apps/">Deploying Apps</a> guide for more detailed information on those.</p> +<h2 id="customizing-the-database">Customizing the Database<a class="td-heading-self-link" href="#customizing-the-database" aria-label="Heading self-link"></a></h2> +<p>The following environment variables are tunable for the <a href="/docs/understanding-workflow/components/#database">Database</a> component:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>BACKUP_FREQUENCY</td> +<td>how often the database should perform a base backup (default: &ldquo;12h&rdquo;)</td> +</tr> +<tr> +<td>BACKUPS_TO_RETAIN</td> +<td>number of base backups the backing store should retain (default: 5)</td> +</tr> +</tbody> +</table> +<h2 id="customizing-fluentbit">Customizing Fluentbit<a class="td-heading-self-link" href="#customizing-fluentbit" aria-label="Heading self-link"></a></h2> +<p>The following values can be changed in the <code>values.yaml</code> file or by using the <code>--values</code> flag with the Helm CLI.</p> +<table> +<thead> +<tr> +<th>Key</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>config.service</td> +<td>The service section defines the global properties of the service.</td> +</tr> +<tr> +<td>config.inputs</td> +<td>An input section defines a source (related to an input plugin).</td> +</tr> +<tr> +<td>config.filters</td> +<td>A filter section defines a filter (related to a filter plugin)</td> +</tr> +<tr> +<td>config.outputs</td> +<td>The outputs section specify a destination that certain records should follow after a Tag match.</td> +</tr> +</tbody> +</table> +<p>For more information about the various variables that can be set please see the <a href="https://github.com/drycc/fluentbit">fluentbit</a>.</p> +<h2 id="customizing-the-logger">Customizing the Logger<a class="td-heading-self-link" href="#customizing-the-logger" aria-label="Heading self-link"></a></h2> +<p>The following environment variables are tunable for the <a href="/docs/understanding-workflow/components/#logger-fluentbit-logger">Logger</a> component:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>STORAGE_ADAPTER</td> +<td>How to store logs that are sent to the logger. Legal values are &ldquo;file&rdquo;, &ldquo;memory&rdquo;, and &ldquo;redis&rdquo;. (default: &ldquo;redis&rdquo;)</td> +</tr> +<tr> +<td>NUMBER_OF_LINES</td> +<td>How many lines to store in the ring buffer (default: 1000)</td> +</tr> +</tbody> +</table> +<h2 id="customizing-the-monitor">Customizing the Monitor<a class="td-heading-self-link" href="#customizing-the-monitor" aria-label="Heading self-link"></a></h2> +<h3 id="grafanahttpsgrafanacom"><a href="https://grafana.com/">Grafana</a><a class="td-heading-self-link" href="#grafanahttpsgrafanacom" aria-label="Heading self-link"></a></h3> +<p>We have exposed some of the more useful configuration values directly in the chart. This allows them to be set using either the <code>values.yaml</code> file or by using the <code>--set</code> flag with the Helm CLI. You can see these options below:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Default Value</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>user</td> +<td>&ldquo;admin&rdquo;</td> +<td>The first user created in the database (this user has admin privileges)</td> +</tr> +<tr> +<td>password</td> +<td>&ldquo;admin&rdquo;</td> +<td>Password for the first user.</td> +</tr> +<tr> +<td>allow_sign_up</td> +<td>&ldquo;true&rdquo;</td> +<td>Allows users to sign up for an account.</td> +</tr> +</tbody> +</table> +<p>For a list of other options you can set by using environment variables please see the <a href="https://github.com/drycc/monitor/blob/main/grafana/rootfs/usr/share/grafana/grafana.ini.tpl">configuration file</a> in Github.</p> +<h3 id="telegrafhttpsdocsinfluxdatacomtelegraf"><a href="https://docs.influxdata.com/telegraf">Telegraf</a><a class="td-heading-self-link" href="#telegrafhttpsdocsinfluxdatacomtelegraf" aria-label="Heading self-link"></a></h3> +<p>For a list of configuration values that can be set by using environment variables please see the following <a href="https://github.com/drycc/monitor/blob/main/telegraf/rootfs/config.toml.tpl">configuration file</a>.</p> +<h3 id="prometheushttpsprometheusio"><a href="https://prometheus.io">Prometheus</a><a class="td-heading-self-link" href="#prometheushttpsprometheusio" aria-label="Heading self-link"></a></h3> +<p>You can find a list of values that can be set using environment variables <a href="https://github.com/drycc/prometheus">here</a>.</p> +<h2 id="customizing-the-registry">Customizing the Registry<a class="td-heading-self-link" href="#customizing-the-registry" aria-label="Heading self-link"></a></h2> +<p>The <a href="/docs/understanding-workflow/components/#registry">Registry</a> component can be tuned by following the +<a href="https://github.com/drycc/distribution/blob/main/docs/configuration.md">drycc/distribution config doc</a>.</p> +<h2 id="customizing-the-router">Customizing the Router<a class="td-heading-self-link" href="#customizing-the-router" aria-label="Heading self-link"></a></h2> +<p>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 +<a href="https://github.com/drycc/router#annotations">here</a>.</p> +<p>The following environment variables are tunable for the [Router][] component:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>POD_NAMESPACE</td> +<td>The pod namespace the router resides in. This is set by the <a href="http://kubernetes.io/docs/user-guide/downward-api/">Kubernetes downward API</a>.</td> +</tr> +</tbody> +</table> +<h2 id="customizing-workflow-manager">Customizing Workflow Manager<a class="td-heading-self-link" href="#customizing-workflow-manager" aria-label="Heading self-link"></a></h2> +<p>The following environment variables are tunable for [Workflow Manager][]:</p> +<table> +<thead> +<tr> +<th>Setting</th> +<th>Description</th> +</tr> +</thead> +<tbody> +<tr> +<td>CHECK_VERSIONS</td> +<td>Enables the external version check at <a href="https://versions.drycc.info/">https://versions.drycc.info/</a> (default: &ldquo;true&rdquo;)</td> +</tr> +<tr> +<td>POLL_INTERVAL_SEC</td> +<td>The interval when Workflow Manager performs a version check, in seconds (default: 43200, or 12 hours)</td> +</tr> +<tr> +<td>VERSIONS_API_URL</td> +<td>The versions API URL (default: &ldquo;<a href="https://versions-staging.drycc.info">https://versions-staging.drycc.info</a>&rdquo;)</td> +</tr> +<tr> +<td>DOCTOR_API_URL</td> +<td>The doctor API URL (default: &ldquo;<a href="https://doctor-staging.drycc.info">https://doctor-staging.drycc.info</a>&rdquo;)</td> +</tr> +<tr> +<td>API_VERSION</td> +<td>The version number Workflow Manager sends to the versions API (default: &ldquo;v2&rdquo;)</td> +</tr> +</tbody> +</table> + + + + + + Docs: Configure DNS + /docs/managing-workflow/configuring-dns/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/configuring-dns/ + + + + <p>For example, assuming <code>example.com</code> were a cluster&rsquo;s domain:</p> +<ul> +<li>The controller should be accessible at <code>drycc.example.com</code></li> +<li>Applications should be accessible (by default) at <code>&lt;application name&gt;.example.com</code></li> +</ul> +<p>Given that this is the case, the primary objective in configuring DNS is that traffic for all subdomains of a cluster&rsquo;s domain be directed to the cluster node(s) hosting the platform&rsquo;s router component, which is capable of directing traffic within the cluster to the correct endpoints.</p> +<h2 id="with-a-load-balancer">With a Load Balancer<a class="td-heading-self-link" href="#with-a-load-balancer" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>For example, assuming a domain of <code>example.com</code>:</p> +<ul> +<li>An <code>A</code> record enumerating each of your load balancer(s) IPs (i.e. DNS round-robining)</li> +<li>A <code>CNAME</code> record referencing an existing fully-qualified domain name for the load balancer +<ul> +<li>Per <a href="https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/using-domain-names-with-elb.html">AWS&rsquo; own documentation</a>, this is the recommended strategy when using AWS Elastic Load Balancers, as ELB IPs may change over time.</li> +</ul> +</li> +</ul> +<p>DNS for any applications using a &ldquo;custom domain&rdquo; (a fully-qualified domain name that is not a subdomain of the cluster&rsquo;s own domain) can be configured by creating a <code>CNAME</code> record that references the wildcard record described above.</p> +<p>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 <code>kubectl</code> tool:</p> +<pre tabindex="0"><code>$ kubectl --namespace=istio-nginx describe service | grep &#34;LoadBalancer&#34; +LoadBalancer Ingress: a493e4e58ea0511e5bb390686bc85da3-1558404688.us-west-2.elb.amazonaws.com +</code></pre><p>The <code>LoadBalancer Ingress</code> 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.</p> +<h2 id="without-a-load-balancer">Without a Load Balancer<a class="td-heading-self-link" href="#without-a-load-balancer" aria-label="Heading self-link"></a></h2> +<p>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 <code>/etc/hosts</code> file.</p> +<p>Because wildcard entries do not work in a local <code>/etc/hosts</code> 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 <a href="http://xip.io/">xip.io</a> service.</p> +<p>In general, for any IP, <code>a.b.c.d</code>, the fully-qualified domain name <code>any-subdomain.a.b.c.d.xip.io</code> will resolve to the IP <code>a.b.c.d</code>. This can be enormously useful.</p> +<p>To begin, find the node(s) hosting router instances using <code>kubectl</code>:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>The command will display information for every router pod. For each, a node name and IP are displayed in the <code>Node</code> field. If the IPs appearing in these fields are public, any of these may be used to configure your local <code>/etc/hosts</code> file or may be used with <a href="http://xip.io/">xip.io</a>. If the IPs shown are not public, further investigation may be needed.</p> +<p>You can list the IP addresses of a node using <code>kubectl</code>:</p> +<pre tabindex="0"><code>$ 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 +# ... +</code></pre><p>Here, the <code>Addresses</code> field lists all the node&rsquo;s IPs. If any of them are public, again, they may be used to configure your local <code>/etc/hosts</code> file or may be used with <a href="http://xip.io/">xip.io</a>.</p> +<h2 id="tutorial-configuring-dns-with-google-cloud-dnscloud-dns">Tutorial: Configuring DNS with <a href="https://cloud.google.com/dns/docs">Google Cloud DNS</a><a class="td-heading-self-link" href="#tutorial-configuring-dns-with-google-cloud-dnscloud-dns" aria-label="Heading self-link"></a></h2> +<p>In this section, we&rsquo;ll describe how to configure Google Cloud DNS for routing your domain name to your Drycc cluster.</p> +<p>We&rsquo;ll assume the following in this section:</p> +<ul> +<li>Your Ingress service has a load balancer in front of it. +<ul> +<li>The load balancer need not be cloud based, it just needs to provide a stable IP address or a stable domain name</li> +</ul> +</li> +<li>You have the <code>mystuff.com</code> domain name registered with a registrar +<ul> +<li>Replace your domain name with <code>mystuff.com</code> in the instructions to follow</li> +</ul> +</li> +<li>Your registrar lets you alter the nameservers for your domain name (most registrars do)</li> +</ul> +<p>Here are the steps for configuring cloud DNS to route to your drycc cluster:</p> +<ol> +<li>Get the load balancer IP or domain name</li> +</ol> +<ul> +<li>If you are on Google Container Engine, you can run <code>kubectl get svc -n istio-ingress</code> and look for the <code>LoadBalancer Ingress</code> column to get the IP address</li> +</ul> +<ol start="2"> +<li>Create a new Cloud DNS Zone (on the console: <code>Networking</code> =&gt; <code>Cloud DNS</code>, then click on <code>Create Zone</code>)</li> +<li>Name your zone, and set the DNS name to <code>mystuff.com.</code> (note the <code>.</code> at the end</li> +<li>Click on the <code>Create</code> button</li> +<li>Click on the <code>Add Record Set</code> button on the resulting page</li> +<li>If your load balancer provides a stable IP address, enter the following fields in the resulting form:</li> +<li><code>DNS Name</code>: <code>*</code></li> +<li><code>Resource Record Type</code>: <code>A</code></li> +<li><code>TTL</code>: the DNS TTL of your choosing. If you&rsquo;re testing or you anticipate that you&rsquo;ll tear down and rebuild many drycc clusters over time, we recommend a low TTL</li> +<li><code>IPv4 Address</code>: The IP that you got in the very first step</li> +<li>Click the <code>Create</code> button</li> +<li>If your load balancer provides the stable domain name <code>lbdomain.com</code>, enter the following fields in the resulting form:</li> +<li><code>DNS Name</code>: <code>*</code></li> +<li><code>Resource Record Type</code>: <code>CNAME</code></li> +<li><code>TTL</code>: the DNS TTL of your choosing. If you&rsquo;re testing or you anticipate that you&rsquo;ll tear down and rebuild many drycc clusters over time, we recommend a low TTL</li> +<li><code>Canonical name</code>: <code>lbdomain.com.</code> (note the <code>.</code> a the end)</li> +<li>Click on the <code>Create</code> button</li> +<li>In your domain registrar, set the nameservers for your <code>mystuff.com</code> domain to the ones under the <code>data</code> column in the <code>NS</code> record on the same page. They&rsquo;ll often be something like the below (note the trailing <code>.</code> characters).</li> +</ol> +<pre tabindex="0"><code>ns-cloud-b1.googledomains.com. +ns-cloud-b2.googledomains.com. +ns-cloud-b3.googledomains.com. +ns-cloud-b4.googledomains.com. +</code></pre><p>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.</p> +<h2 id="testing">Testing<a class="td-heading-self-link" href="#testing" aria-label="Heading self-link"></a></h2> +<p>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!):</p> +<pre tabindex="0"><code>curl http://drycc.example.com/v2/ +</code></pre><p>Or:</p> +<pre tabindex="0"><code>curl http://drycc.54.218.85.175.xip.io/v2/ +</code></pre><p>Since such requests require authentication, a response such as the following should be considered an indicator of success:</p> +<pre tabindex="0"><code>{&#34;detail&#34;:&#34;Authentication credentials were not provided.&#34;} +</code></pre> + + + + + Docs: Deploy Hooks + /docs/managing-workflow/deploy-hooks/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/deploy-hooks/ + + + + <p>It’s useful to help keep the development team informed about deploys, while +it can also be used to integrate different systems together.</p> +<p>After one or more hooks are setup, hook output and errors appear in your application’s logs:</p> +<pre tabindex="0"><code>$ drycc logs +... +2011-03-15T15:07:29-07:00 drycc[api]: Deploy hook sent to http://drycc.rocks +</code></pre><p>Deploy hooks are a generic HTTP hook. An administrator can create and configure multiple deploy +hooks by <a href="/docs/managing-workflow/tuning-component-settings/#customizing-the-controller">tuning the controller settings</a> via the Helm chart.</p> +<h2 id="http-post-hook">HTTP POST Hook<a class="td-heading-self-link" href="#http-post-hook" aria-label="Heading self-link"></a></h2> +<p>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: <code>app</code>, <code>release</code>, <code>release_summary</code>, <code>sha</code> and +<code>user</code>. See below for their descriptions:</p> +<pre tabindex="0"><code>app=secure-woodland&amp;release=v4&amp;release_summary=gabrtv%20deployed%35b3726&amp;sha=35b3726&amp;user=gabrtv +</code></pre><p>Optionally, if a deploy hook secret key is added to the controller through +<a href="/docs/managing-workflow/tuning-component-settings/#customizing-the-controller">tuning the controller settings</a>, a new <code>Authorization</code> header will be +present in the POST request. The value of this header is computed as the <a href="https://en.wikipedia.org/wiki/Hash-based_message_authentication_code">HMAC</a> hex digest of the +request URL, using the secret as the key.</p> +<p>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:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#204a87;font-weight:bold">import</span> <span style="color:#000">hashlib</span> +</span></span><span style="display:flex;"><span><span style="color:#204a87;font-weight:bold">import</span> <span style="color:#000">hmac</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#000">hmac</span><span style="color:#ce5c00;font-weight:bold">.</span><span style="color:#000">new</span><span style="color:#000;font-weight:bold">(</span><span style="color:#4e9a06">&#34;my_secret_key&#34;</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#4e9a06">&#34;http://drycc.rocks?app=secure-woodland&amp;release=v4&amp;release_summary=gabrtv</span><span style="color:#4e9a06">%20d</span><span style="color:#4e9a06">eployed%35b3726&amp;sha=35b3726&amp;user=gabrtv&#34;</span><span style="color:#000;font-weight:bold">,</span> <span style="color:#000">digestmod</span><span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#000">hashlib</span><span style="color:#ce5c00;font-weight:bold">.</span><span style="color:#000">sha1</span><span style="color:#000;font-weight:bold">)</span><span style="color:#ce5c00;font-weight:bold">.</span><span style="color:#000">hexdigest</span><span style="color:#000;font-weight:bold">()</span> +</span></span></code></pre></div><p>If the value of the computed HMAC hex digest and the value in the <code>Authorization</code> header are +identical, then the request came from Workflow.</p> +<p>!!! 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&rsquo;t care about +the order of the HTTP parameters, but the cryptographic signature will not be the same.</p> + + + + + + Docs: Platform Logging + /docs/managing-workflow/platform-logging/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/platform-logging/ + + + + <p>The logging platform is made up of 2 components - <a href="https://github.com/drycc/fluentbit">Fluentbit</a> and <a href="https://github.com/drycc/logger">Logger</a>.</p> +<p><a href="https://github.com/drycc/fluentbit">Fluentbit</a> runs on every worker node of the cluster and is deployed as a <a href="http://kubernetes.io/v1.1/docs/admin/daemons.html">Daemon Set</a>. 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 <a href="https://github.com/drycc/fluentbit/tree/main/plugin">custom fluentbit plugin</a> we determine where the message originated.</p> +<p>If the message was from the <a href="https://github.com/drycc/controller">Workflow Controller</a> or from an application deployed via workflow we send it to the logs topic on the local <a href="http://redis.io">Redis Stream</a> instance.</p> +<p>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 <code>drycc logs</code> command we make an HTTP request from Controller to Logger which then fetches the appropriate data from Redis.</p> +<h2 id="configuring-off-cluster-redis">Configuring Off Cluster Redis<a class="td-heading-self-link" href="#configuring-off-cluster-redis" aria-label="Heading self-link"></a></h2> +<p>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:</p> +<ul> +<li>db = &ldquo;0&rdquo;</li> +<li>host = &ldquo;my.host.redis&rdquo;</li> +<li>port = &ldquo;6379&rdquo;</li> +<li>password = &quot;&quot;</li> +</ul> +<p>These can be changed by running <code>helm inspect values drycc/workflow &gt; values.yaml</code> before using +<code>helm install</code> to complete the installation. To customize the redis credentials, edit <code>values.yaml</code> +and modify the <code>redis</code> section of the file to tune these settings.</p> +<h2 id="debugging-logger">Debugging Logger<a class="td-heading-self-link" href="#debugging-logger" aria-label="Heading self-link"></a></h2> +<p>If the <code>drycc logs</code> command encounters an error it will return the following message:</p> +<pre tabindex="0"><code>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 &lt;logger pod&gt; +3) Making sure that the container logs were mounted properly into the fluentbit pod: kubectl --namespace=drycc exec &lt;fluentbit pod&gt; ls /var/log/containers +</code></pre><h2 id="architecture-diagram">Architecture Diagram<a class="td-heading-self-link" href="#architecture-diagram" aria-label="Heading self-link"></a></h2> +<pre tabindex="0"><code> ┌────────┐ + │ Router │ ┌────────┐ ┌─────┐ + └────────┘ │ Logger │◀───▶│Redis│ + │ └────────┘ └─────┘ + Log file ▲ + │ │ + ▼ │ +┌────────┐ ┌─────────┐ logs/metrics ┌──────────────┐ +│App Logs│──Log File──▶│Fluentbit│───────topics─────▶│ Redis Stream │ +└────────┘ └─────────┘ └──────────────┘ + +</code></pre><h2 id="default-configuration">Default Configuration<a class="td-heading-self-link" href="#default-configuration" aria-label="Heading self-link"></a></h2> +<p>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 <a href="https://github.com/drycc/fluentbit/blob/main/charts/fluentbit/values.yaml">values.yaml</a> for specific configurations.</p> + + + + + + Docs: Platform Monitoring + /docs/managing-workflow/platform-monitoring/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/platform-monitoring/ + + + + <h2 id="description">Description<a class="td-heading-self-link" href="#description" aria-label="Heading self-link"></a></h2> +<p>We now include a monitoring stack for introspection on a running Kubernetes cluster. The stack includes 4 components:</p> +<ul> +<li><a href="https://github.com/kubernetes/kube-state-metrics">kube-state-metrics</a>, kube-state-metrics (KSM) is a simple service that listens to the Kubernetes API server and generates metrics about the state of the objects.</li> +<li><a href="http://github.com/prometheus/node_exporter">Node Exporter</a>, Prometheus exporter for hardware and OS metrics exposed by *NIX kernels.</li> +<li><a href="https://prometheus.io/">Prometheus</a>, a <a href="https://cncf.io/">Cloud Native Computing Foundation</a> project, is a systems and service monitoring system.</li> +<li><a href="http://grafana.org/">Grafana</a>, Graphing tool for time series data</li> +</ul> +<h2 id="architecture-diagram">Architecture Diagram<a class="td-heading-self-link" href="#architecture-diagram" aria-label="Heading self-link"></a></h2> +<pre tabindex="0"><code>┌────────────────┐ +│ HOST │ +│ node-exporter │◀──┐ ┌──────────────────┐ +└────────────────┘ │ │kube-state-metrics│ + │ └──────────────────┘ +┌────────────────┐ │ ▲ +│ HOST │ │ ┌────────────┐ │ +│ node-exporter │◀──┼────│ Prometheus │─────────────┘ +└────────────────┘ │ └────────────┘ + │ ▲ +┌───────────────┐ │ │ +│ HOST │ │ ▼ +│ node-exporter│◀───┘ ┌──────────┐ +└───────────────┘ │ Grafana │ + └──────────┘ +</code></pre><h2 id="grafanahttpsgrafanacom"><a href="https://grafana.com/">Grafana</a><a class="td-heading-self-link" href="#grafanahttpsgrafanacom" aria-label="Heading self-link"></a></h2> +<p>Grafana allows users to create custom dashboards that visualize the data captured to the running Prometheus component. By default Grafana is exposed using a <a href="https://github.com/drycc/router#how-it-works">service annotation</a> through the router at the following URL: <code>http://grafana.mydomain.com</code>. The default login is <code>admin/admin</code>. If you are interested in changing these values please see [Tuning Component Settings][].</p> +<p>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&rsquo;t include every item that might be desirable to monitor in a +production installation.</p> +<p>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.</p> +<h3 id="production-configuration">Production Configuration<a class="td-heading-self-link" href="#production-configuration" aria-label="Heading self-link"></a></h3> +<p>A production install of Grafana should have the following configuration values changed if possible:</p> +<ul> +<li>Change the default username and password from <code>admin/admin</code>. 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.</li> +<li>Enable persistence</li> +<li>Use a supported external database such as mysql or postgres. You can find more information <a href="https://github.com/drycc/monitor/blob/main/grafana/rootfs/usr/share/grafana/grafana.ini.tpl#L62">here</a></li> +</ul> +<h3 id="on-cluster-persistence">On Cluster Persistence<a class="td-heading-self-link" href="#on-cluster-persistence" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p>If you wish to have persistence for Grafana you can set <code>enabled</code> to <code>true</code> in the <code>values.yaml</code> file before running <code>helm install</code>.</p> +<pre tabindex="0"><code> 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 +</code></pre><h3 id="off-cluster-grafana">Off Cluster Grafana<a class="td-heading-self-link" href="#off-cluster-grafana" aria-label="Heading self-link"></a></h3> +<p>If you wish to provide your own Grafana instance you can set <code>grafanaLocation</code> in the <code>values.yaml</code> file before running <code>helm install</code>.</p> +<h2 id="prometheushttpsprometheusio"><a href="https://prometheus.io/">Prometheus</a><a class="td-heading-self-link" href="#prometheushttpsprometheusio" aria-label="Heading self-link"></a></h2> +<p>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 <code>prometheus.mydomain.com</code>.</p> +<h3 id="on-cluster-persistence-1">On Cluster Persistence<a class="td-heading-self-link" href="#on-cluster-persistence-1" aria-label="Heading self-link"></a></h3> +<p>You can set <code>node-exporter</code> and <code>kube-state-metrics</code> to <code>true</code> or <code>false</code> in the <code>values.yaml</code>. +If you wish to have persistence for Prometheus you can set <code>enabled</code> to <code>true</code> in the <code>values.yaml</code> file before running <code>helm install</code>.</p> +<pre tabindex="0"><code>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 +</code></pre><h3 id="off-cluster-prometheus">Off Cluster Prometheus<a class="td-heading-self-link" href="#off-cluster-prometheus" aria-label="Heading self-link"></a></h3> +<p>To use off-cluster Prometheus, please provide the following values in the <code>values.yaml</code> file before running <code>helm install</code>.</p> +<ul> +<li><code>global.prometheusLocation=off-cluster</code></li> +<li><code>url = &quot;http://my.prometheus.url:9090&quot;</code></li> +</ul> + + + + + + Docs: Production Deployments + /docs/managing-workflow/production-deployments/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/production-deployments/ + + + + <h2 id="running-workflow-without-drycc-storage">Running Workflow without drycc storage<a class="td-heading-self-link" href="#running-workflow-without-drycc-storage" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>Running a Workflow cluster without Storage provides several advantages:</p> +<ul> +<li>Removal of state from the worker nodes</li> +<li>Reduced resource usage</li> +<li>Reduced complexity and operational burden of managing Workflow</li> +</ul> +<p>See <a href="/docs/installing-workflow/configuring-object-storage/">Configuring Object Storage</a> for details on removing this operational complexity.</p> +<h2 id="review-security-considerations">Review Security Considerations<a class="td-heading-self-link" href="#review-security-considerations" aria-label="Heading self-link"></a></h2> +<p>There are some additional security-related considerations when running Workflow in production. +See [Security Considerations][] for details.</p> +<h2 id="registration-is-admin-only">Registration is Admin-Only<a class="td-heading-self-link" href="#registration-is-admin-only" aria-label="Heading self-link"></a></h2> +<p>By default, registration with the Workflow controller is in &ldquo;admin_only&rdquo; mode. The first user +to run a <code>drycc register</code> command becomes the initial &ldquo;admin&rdquo; user, and registrations after that +are disallowed unless requested by an admin.</p> +<p>Please see the following documentation to learn about changing registration mode:</p> +<ul> +<li><a href="/docs/managing-workflow/tuning-component-settings/#customizing-the-controller">Customizing Controller</a></li> +</ul> +<h2 id="disable-grafana-signups">Disable Grafana Signups<a class="td-heading-self-link" href="#disable-grafana-signups" aria-label="Heading self-link"></a></h2> +<p>It is also recommended to disable signups for the Grafana dashboards.</p> +<p>Please see the following documentation to learn about disabling Grafana signups:</p> +<ul> +<li><a href="/docs/managing-workflow/tuning-component-settings/#customizing-the-monitor">Customizing Monitor</a></li> +</ul> +<h2 id="running-workflow-with-rbac">Running Workflow with RBAC<a class="td-heading-self-link" href="#running-workflow-with-rbac" aria-label="Heading self-link"></a></h2> +<p>If your cluster has <a href="https://kubernetes.io/docs/admin/authorization/rbac/">RBAC</a> amongst your <a href="https://kubernetes.io/docs/admin/authorization/">authorization</a> modes (<code>$ kubectl api-versions</code> should contains <code>rbac.authorization.k8s.io</code>) it may be necessary to enable RBAC in Workflow. +This can be achieved by setting <code>use_rbac</code> in the <code>global</code> section of <code>values.yaml</code> to <code>true</code>, or by adding <code>--set=global.use_rbac=true</code> to the <code>$ helm install/upgrade</code> command. +RBAC support was announced in Kubernetes-1.5 and is enabled by default if:</p> +<ul> +<li>your Kubernetes cluster is in GKE</li> +<li>your Kubernetes cluster built with <a href="https://kubernetes.io/docs/getting-started-guides/kubeadm/">kubeadm</a></li> +</ul> +<p><strong>Note</strong>: helm may need to be given <a href="/docs/installing-workflow/#check-your-authorization">specific permissions</a> under RBAC if not already done.</p> +<p><strong>Attention</strong>: Azure ACS Kubernetes clusters are not RBAC-enabled for today due to lack in authentication strategy. Feel free to watch this <a href="https://github.com/kubernetes/kubernetes/pull/43987">PR</a> for more details.</p> + + + + + + Docs: Upgrading Workflow + /docs/managing-workflow/upgrading-workflow/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/managing-workflow/upgrading-workflow/ + + + + <p>This upgrade process requires:</p> +<ul> +<li>Helm version <a href="https://github.com/kubernetes/helm/releases/tag/v2.1.0">2.1.0 or newer</a></li> +<li>Configured Off-Cluster Storage</li> +</ul> +<h2 id="upgrade-process">Upgrade Process<a class="td-heading-self-link" href="#upgrade-process" aria-label="Heading self-link"></a></h2> +<p>!!! note +If upgrading from a <a href="https://github.com/helm/helm-classic">Helm Classic</a> install, you&rsquo;ll need to &lsquo;migrate&rsquo; the cluster to a <a href="https://github.com/kubernetes/helm">Kubernetes Helm</a> installation. See <a href="https://github.com/drycc/workflow-migration/blob/main/README.md">Workflow-Migration</a> for steps.</p> +<h3 id="step-1-apply-the-workflow-upgrade">Step 1: Apply the Workflow upgrade<a class="td-heading-self-link" href="#step-1-apply-the-workflow-upgrade" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p>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.</p> +<p>First, find the name of the release helm gave to your deployment with <code>helm ls</code>, then run</p> +<pre tabindex="0"><code>$ helm upgrade &lt;release-name&gt; oci://registry.drycc.cc/charts/workflow +</code></pre><p><strong>Note:</strong> If using off-cluster object storage on <a href="https://cloud.google.com/storage/">gcs</a> and/or off-cluster registry using <a href="https://cloud.google.com/container-registry/">gcr</a> and intending to upgrade from a pre-<code>v2.10.0</code> chart to <code>v2.10.0</code> or greater, the <code>key_json</code> values will now need to be pre-base64-encoded. Therefore, assuming the rest of the custom/off-cluster values are defined in the existing <code>values.yaml</code> used for previous installs, the following may be run:</p> +<pre tabindex="0"><code>$ B64_KEY_JSON=&#34;$(cat ~/path/to/key.json | base64 -w 0)&#34; +$ helm upgrade &lt;release_name&gt; drycc/workflow -f values.yaml --set gcs.key_json=&#34;${B64_KEY_JSON}&#34;,registry-token-refresher.gcr.key_json=&#34;${B64_KEY_JSON}&#34; +</code></pre><p>Alternatively, simply replace the appropriate values in values.yaml and do without the <code>--set</code> +parameter. Make sure to wrap it in single quotes as double quotes will give a parser error when +upgrading.</p> +<h3 id="step-2-verify-upgrade">Step 2: Verify Upgrade<a class="td-heading-self-link" href="#step-2-verify-upgrade" aria-label="Heading self-link"></a></h3> +<p>Verify that all components have started and passed their readiness checks:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><h3 id="step-3-upgrade-the-drycc-client">Step 3: Upgrade the Drycc Client<a class="td-heading-self-link" href="#step-3-upgrade-the-drycc-client" aria-label="Heading self-link"></a></h3> +<p>Users of Drycc Workflow should now upgrade their drycc client to avoid getting <code>WARNING: Client and server API versions do not match. Please consider upgrading.</code> warnings.</p> +<pre tabindex="0"><code>curl -sfL https://www.drycc.cc/install-cli.sh | bash - &amp;&amp; sudo mv drycc $(which drycc) +</code></pre> + + + + + diff --git a/docs/managing-workflow/platform-logging/index.html b/docs/managing-workflow/platform-logging/index.html new file mode 100644 index 000000000..ee9433a35 --- /dev/null +++ b/docs/managing-workflow/platform-logging/index.html @@ -0,0 +1,498 @@ + + + + + + + + + + + + + + + + + + + +Platform Logging | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Platform Logging

+
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.
+ +

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.

+

Configuring Off Cluster 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:

+
    +
  • db = “0”
  • +
  • host = “my.host.redis”
  • +
  • port = “6379”
  • +
  • password = ""
  • +
+

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.

+

Debugging Logger

+

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
+

Architecture Diagram

+
                        ┌────────┐                                        
+                        │ Router │                  ┌────────┐     ┌─────┐
+                        └────────┘                  │ Logger │◀───▶│Redis│
+                            │                       └────────┘     └─────┘
+                        Log file                        ▲                
+                            │                           │                
+                            ▼                           │                
+┌────────┐             ┌─────────┐    logs/metrics   ┌──────────────┐     
+│App Logs│──Log File──▶│Fluentbit│───────topics─────▶│ Redis Stream │     
+└────────┘             └─────────┘                   └──────────────┘     
+                                                                          
+

Default Configuration

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/managing-workflow/platform-monitoring/index.html b/docs/managing-workflow/platform-monitoring/index.html new file mode 100644 index 000000000..e955cfd96 --- /dev/null +++ b/docs/managing-workflow/platform-monitoring/index.html @@ -0,0 +1,541 @@ + + + + + + + + + + + + + + + + + + + +Platform Monitoring | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Platform Monitoring

+
Platform monitoring to your apps to spot issues in advance and respond to incidents quickly.
+ +

Description

+

We now include a monitoring stack for introspection on a running Kubernetes cluster. The stack includes 4 components:

+ +

Architecture Diagram

+
┌────────────────┐                                                        
+│ HOST           │                                                        
+│  node-exporter │◀──┐                       ┌──────────────────┐         
+└────────────────┘   │                       │kube-state-metrics│         
+                     │                       └──────────────────┘         
+┌────────────────┐   │                               ▲                    
+│ HOST           │   │    ┌────────────┐             │                    
+│  node-exporter │◀──┼────│ Prometheus │─────────────┘                    
+└────────────────┘   │    └────────────┘                                  
+                     │          ▲                                         
+┌───────────────┐    │          │                                         
+│ HOST          │    │          ▼                                         
+│  node-exporter│◀───┘    ┌──────────┐                                    
+└───────────────┘         │ Grafana  │                                    
+                          └──────────┘                                    
+

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.

+

Production Configuration

+

A production install of Grafana should have the following configuration values changed if possible:

+
    +
  • Change the default username and password from 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.
  • +
  • Enable persistence
  • +
  • Use a supported external database such as mysql or postgres. You can find more information here
  • +
+

On Cluster Persistence

+

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
+

Off Cluster Grafana

+

If you wish to provide your own Grafana instance you can set grafanaLocation in the values.yaml file before running helm install.

+

Prometheus

+

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.

+

On Cluster Persistence

+

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
+

Off Cluster Prometheus

+

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"
  • +
+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/managing-workflow/production-deployments/index.html b/docs/managing-workflow/production-deployments/index.html new file mode 100644 index 000000000..36763e1b7 --- /dev/null +++ b/docs/managing-workflow/production-deployments/index.html @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + +Production Deployments | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Production Deployments

+
When readying a Workflow deployment for production workloads, there are some additional recommendations.
+ +

Running Workflow without drycc storage

+

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:

+
    +
  • Removal of state from the worker nodes
  • +
  • Reduced resource usage
  • +
  • Reduced complexity and operational burden of managing Workflow
  • +
+

See Configuring Object Storage for details on removing this operational complexity.

+

Review Security Considerations

+

There are some additional security-related considerations when running Workflow in production. +See [Security Considerations][] for details.

+

Registration is Admin-Only

+

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:

+ +

Disable Grafana Signups

+

It is also recommended to disable signups for the Grafana dashboards.

+

Please see the following documentation to learn about disabling Grafana signups:

+ +

Running Workflow with RBAC

+

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:

+
    +
  • your Kubernetes cluster is in GKE
  • +
  • your Kubernetes cluster built with kubeadm
  • +
+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/managing-workflow/tuning-component-settings/index.html b/docs/managing-workflow/tuning-component-settings/index.html new file mode 100644 index 000000000..6bd6d9662 --- /dev/null +++ b/docs/managing-workflow/tuning-component-settings/index.html @@ -0,0 +1,822 @@ + + + + + + + + + + + + + + + + + + + +Tuning Component Settings | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Tuning Component Settings

+
Helm Charts are a set of Kubernetes manifests that reflect best practices for deploying an application or service on Kubernetes.
+ +

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.

    +
  • +
+

Setting Resource limits

+

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"
+

Customizing the Builder

+

The following environment variables are tunable for the Builder component:

+ + + + + + + + + + + + + + + + + +
SettingDescription
DEBUGEnable debug log output (default: false)
BUILDER_POD_NODE_SELECTORA 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
+

Customizing the Controller

+

The following environment variables are tunable for the Controller component:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
REGISTRATION_MODEset registration to “enabled”, “disabled”, or “admin_only” (default: “admin_only”)
GUNICORN_WORKERSnumber of gunicorn workers spawned to process requests (default: CPU cores * 4 + 1)
RESERVED_NAMESa comma-separated list of names which applications cannot reserve for routing (default: “drycc, drycc-builder”)
DRYCC_DEPLOY_HOOK_URLSa comma-separated list of URLs to send deploy hooks to.
DRYCC_DEPLOY_HOOK_SECRET_KEYa private key used to compute the HMAC signature for deploy hooks.
DRYCC_DEPLOY_REJECT_IF_PROCFILE_MISSINGrejects 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_REMOVEwhen 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_TAGSset tags for all applications by default, for example: ‘{“role”: “worker”}’. (default: ‘’)
KUBERNETES_NAMESPACE_DEFAULT_QUOTA_SPECset 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)
+

LDAP authentication settings

+

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:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
LDAP_ENDPOINTThe URI of the LDAP server. If not specified, LDAP authentication is not enabled (default: “”, example: ldap://hostname).
LDAP_BIND_DNThe distinguished name to use when binding to the LDAP server (default: “”)
LDAP_BIND_PASSWORDThe password to use with LDAP_BIND_DN (default: “”)
LDAP_USER_BASEDNThe distinguished name of the search base for user names (default: “”)
LDAP_USER_FILTERThe name of the login field in the users search base (default: “username”)
LDAP_GROUP_BASEDNThe distinguished name of the search base for user’s groups names (default: “”)
LDAP_GROUP_FILTERThe filter for user’s groups (default: “”, example: objectClass=person)
+

Global and per application settings

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
DRYCC_DEPLOY_BATCHESthe number of pods to bring up and take down sequentially during a scale (default: number of available nodes)
DRYCC_DEPLOY_TIMEOUTdeploy timeout in seconds per deploy batch (default: 120)
IMAGE_PULL_POLICYthe kubernetes image pull policy for application images (default: “IfNotPresent”) (allowed values: “Always”, “IfNotPresent”)
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIThow many revisions Kubernetes keeps around of a given Deployment (default: all revisions)
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDShow 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.

+

Customizing the Database

+

The following environment variables are tunable for the Database component:

+ + + + + + + + + + + + + + + + + +
SettingDescription
BACKUP_FREQUENCYhow often the database should perform a base backup (default: “12h”)
BACKUPS_TO_RETAINnumber of base backups the backing store should retain (default: 5)
+

Customizing Fluentbit

+

The following values can be changed in the values.yaml file or by using the --values flag with the Helm CLI.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
KeyDescription
config.serviceThe service section defines the global properties of the service.
config.inputsAn input section defines a source (related to an input plugin).
config.filtersA filter section defines a filter (related to a filter plugin)
config.outputsThe 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.

+

Customizing the Logger

+

The following environment variables are tunable for the Logger component:

+ + + + + + + + + + + + + + + + + +
SettingDescription
STORAGE_ADAPTERHow to store logs that are sent to the logger. Legal values are “file”, “memory”, and “redis”. (default: “redis”)
NUMBER_OF_LINESHow many lines to store in the ring buffer (default: 1000)
+

Customizing the Monitor

+

Grafana

+

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:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDefault ValueDescription
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.

+

Telegraf

+

For a list of configuration values that can be set by using environment variables please see the following configuration file.

+

Prometheus

+

You can find a list of values that can be set using environment variables here.

+

Customizing the Registry

+

The Registry component can be tuned by following the +drycc/distribution config doc.

+

Customizing the Router

+

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:

+ + + + + + + + + + + + + +
SettingDescription
POD_NAMESPACEThe pod namespace the router resides in. This is set by the Kubernetes downward API.
+

Customizing Workflow Manager

+

The following environment variables are tunable for [Workflow Manager][]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
CHECK_VERSIONSEnables the external version check at https://versions.drycc.info/ (default: “true”)
POLL_INTERVAL_SECThe interval when Workflow Manager performs a version check, in seconds (default: 43200, or 12 hours)
VERSIONS_API_URLThe versions API URL (default: “https://versions-staging.drycc.info”)
DOCTOR_API_URLThe doctor API URL (default: “https://doctor-staging.drycc.info”)
API_VERSIONThe version number Workflow Manager sends to the versions API (default: “v2”)
+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/managing-workflow/upgrading-workflow/index.html b/docs/managing-workflow/upgrading-workflow/index.html new file mode 100644 index 000000000..236752714 --- /dev/null +++ b/docs/managing-workflow/upgrading-workflow/index.html @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + +Upgrading Workflow | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Upgrading Workflow

+
Drycc Workflow releases may be upgraded in-place with minimal downtime.
+ +

This upgrade process requires:

+ +

Upgrade Process

+

!!! 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.

+

Step 1: Apply the Workflow upgrade

+

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.

+

Step 2: Verify Upgrade

+

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
+

Step 3: Upgrade the Drycc Client

+

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)
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/quickstart/_print/index.html b/docs/quickstart/_print/index.html new file mode 100644 index 000000000..5ac505312 --- /dev/null +++ b/docs/quickstart/_print/index.html @@ -0,0 +1,772 @@ + + + + + + + + + + + + + + + + + + + + + +Quick Start | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Quick Start

+
Step-by-step guides for deploying your first app and mastering the basics of Drycc.
+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + +
+ +

1 - Quick Start

+
This guide helps you set up the Drycc workflow.
+

Get started with Drycc Workflow in three easy steps.

+
    +
  1. Install CLI tools for Helm and Drycc Workflow
  2. +
  3. Boot a Kubernetes and install Drycc Workflow
  4. +
  5. Deploy your first application
  6. +
+

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.

+

Step 1: Install Workflow

+

For the quickstart we will install Drycc Workflow.

+

Step 2: Install CLI tools

+

For the quickstart we will install Drycc Workflow CLI.

+

Step 3: Deploy your first app

+

Last but not least, login and deploy your first application.

+ +
+ + + + + + + + + + + +
+ +

2 - Install Workflow

+
Install Workflow in pure host, it can be a cloud server, bare metal server, virtual machine, or even your laptop.
+

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.

+

Operating Systems

+

Drycc is expected to work on most modern Linux systems. Some OSS have specific requirements:

+
    +
  • (Red Hat/CentOS) Enterprise Linux, they usually use RPM package management.
  • +
  • Ubuntu (Desktop/Server/Cloud) Linux, a very popular distribution.
  • +
  • Debian GNU Linux, a very pure distribution of opensource software.
  • +
+

If you want to add more Linux distribution support, please submit a issue on github or submit PR directly.

+

System Software

+

Some basic software needs to be installed before installing drycc workflow.

+

OS configuration

+

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.

+

Installing NFSv4 client

+

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
+

Installing curl

+

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

+

Hardware requirements scale based on the size of your deployments. Minimum recommendations are outlined here.

+
    +
  • RAM: 1G Minimum (we recommend at least 2GB)
  • +
  • CPU: 1 Minimum
  • +
+

This configuration only contains the minimum requirements that can meet the operation.

+

Disk

+

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.

+

Domain Name

+

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
+

Install

+

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 -
+```
+
+

Install Node

+

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.

+
    +
  • First, check the cluster token of the master.
  • +
+
$ 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.

+
    +
  • Then, Set the environment variable:
  • +
+
$ 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
+```
+
+
    +
  • Join the cluster as server:
  • +
+
$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_server
+
    +
  • Join the cluster as agent:
  • +
+
$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_agent
+

Install Options

+

When using this method to install drycc, the following environment variables can be used to configure the installation:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ENVIRONMENT VARIABLEDESCRIPTION
PLATFORM_DOMAINRequired item, specify drycc’s domain name
DRYCC_ADMIN_USERNAMERequired item, specify drycc’s admin username
DRYCC_ADMIN_PASSWORDRequired item, specify drycc’s admin password
CERT_MANAGER_ENABLEDWhether to use automatic certificate. It is false by default
CHANNELBy default, stable channel will be installed. You can also specify testing
REGISTRY_FILEThe config.yaml file path used by k3s containers registry
KUBERNETES_SERVICE_HOSTSet with the HOST of the loadbalancer that was in front of kube-apiserver
KUBERNETES_SERVICE_PORTSet with the PORT of the loadbalancer that was in front of kube-apiserver
METALLB_CONFIG_FILEThe metallb config file path, layer 2 network is used by default
INSTALL_DRYCC_MIRRORSpecify the accelerated mirror location. Currently, only cn is supported
BUILDER_REPLICASNumber of builder replicas to deploy
CONTROLLER_API_REPLICASNumber of controller api replicas to deploy
CONTROLLER_CELERY_REPLICASNumber of controller celery replicas to deploy
CONTROLLER_WEBHOOK_REPLICASNumber of controller webhook replicas to deploy
CONTROLLER_APP_RUNTIME_CLASSRuntimeClass is a feature for selecting the container runtime configuration.
CONTROLLER_APP_STORAGE_CLASSStorageClass allocated by drycc volumes; default storageClass is used by default
REDIS_REPLICASNumber of redis replicas to deploy
REDIS_PERSISTENCE_SIZEThe size of the persistence space allocated to redis, which is 5Gi by default
REDIS_PERSISTENCE_STORAGE_CLASSStorangeClass of redis; default storangeclass is used by default
STORAGE_CSI_STATEFULSET_REPLICASNumber of storage csi controller replicas to deploy
STORAGE_MAINNODE_TIPD_REPLICASNumber of storage mainode tipd replicas to deploy
STORAGE_MAINNODE_TIPD_PERSISTENCE_SIZEThe size of the persistence space allocated to mainnode tipd, which is 10Gi by default
STORAGE_MAINNODE_TIPD_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode tipd; default storangeclass is used by default
STORAGE_MAINNODE_WEED_REPLICASNumber of storage mainode weed replicas to deploy
STORAGE_MAINNODE_WEED_PREALLOCATEPreallocate disk space for volumes, false is used by default
STORAGE_MAINNODE_WEED_SIZE_LIMIT_MBMaster stops directing writes to oversized volumes, 30000 is used by default
STORAGE_MAINNODE_WEED_DEFAULT_REPLICATIONdefault replication type if not specified, which is 000 by default
STORAGE_MAINNODE_WEED_PERSISTENCE_SIZEThe size of the persistence space allocated to mainnode weed, which is 10Gi by default
STORAGE_MAINNODE_WEED_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode weed; default storangeclass is used by default
STORAGE_METANODE_TIKV_REPLICASNumber of storage metanode tikv replicas to deploy
STORAGE_METANODE_TIKV_PERSISTENCE_SIZEThe size of the persistence space allocated to metanode tikv, which is 10Gi by default
STORAGE_METANODE_TIKV_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode tikv; default storangeclass is used by default
STORAGE_METANODE_WEED_REPLICASNumber of storage metanode weed replicas to deploy
STORAGE_METANODE_WEED_PERSISTENCE_SIZEThe size of the persistence space allocated to metanode weed, which is 10Gi by default
STORAGE_METANODE_WEED_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode weed; default storangeclass is used by default
STORAGE_DATANODE_WEED_REPLICASNumber of storage datanode weed replicas to deploy
STORAGE_DATANODE_WEED_PERSISTENCE_SIZEThe size of the persistence space allocated to datanode weed, which is 20Gi by default
STORAGE_DATANODE_WEED_PERSISTENCE_STORAGE_CLASSStorangeClass of datanode weed; default storangeclass is used by default
MONITOR_GRAFANA_PERSISTENCE_SIZEThe size of the persistence space allocated to monitor.grafana, which is 5Gi by default
MONITOR_GRAFANA_PERSISTENCE_STORAGE_CLASSStorangeClass of monitor grafana; default storangeclass is used by default
LOGGER_REPLICASNumber of logger replicas to deploy
RABBITMQ_REPLICASNumber of rabbitmq replicas to deploy
RABBITMQ_PERSISTENCE_SIZEThe size of the persistence space allocated to rabbitmq, which is 5Gi by default
RABBITMQ_PERSISTENCE_STORAGE_CLASSStorangeClass of rabbitmq; default storangeclass is used by default
DATABASE_REPLICASNumber of database replicas to deploy
DATABASE_PERSISTENCE_SIZEThe size of the persistence space allocated to database, which is 5Gi by default
DATABASE_PERSISTENCE_STORAGE_CLASSStorangeClass of database; default storangeclass is used by default
TIMESERIES_REPLICASNumber of timeseries replicas to deploy
TIMESERIES_PERSISTENCE_SIZEThe size of the persistence space allocated to timeseries, which is 5Gi by default
TIMESERIES_PERSISTENCE_STORAGE_CLASSStorangeClass of timeseries; default storangeclass is used by default
PASSPORT_REPLICASNumber of passport replicas to deploy
REGISTRY_REPLICASNumber of registry replicas to deploy
HELMBROKER_REPLICASNumber of helmbroker api replicas to deploy
HELMBROKER_CELERY_REPLICASNumber of helmbroker celery replicas to deploy
HELMBROKER_PERSISTENCE_SIZEThe size of the persistence space allocated to helmbroker, which is 5Gi by default
HELMBROKER_PERSISTENCE_STORAGE_CLASSStorangeClass of helmbroker; default storangeclass is used by default
PROMETHEUS_SERVER_RETENTIONPrometheus data retention period (default if not specified is 15 days)
PROMETHEUS_SERVER_PERSISTENCE_SIZEThe size of the persistence space allocated to prometheus-server, which is 10Gi by default
PROMETHEUS_SERVER_PERSISTENCE_STORAGE_CLASSStorangeClass of prometheus-server; default storangeclass is used by default
K3S_DATA_DIRThe config of k3s data dir; If not set, the default path is used
ACME_SERVERACME Server url, default use letsencrypt
ACME_EAB_KEY_IDThe key ID of which your external account binding is indexed by the external account
ACME_EAB_KEY_SECRETThe 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.

+

Uninstall

+

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 -
+
+
+ + + + + + + + + + + +
+ +

3 - Drycc Workflow Client CLI

+
How to download, install Drycc CLI tools.
+

Drycc Workflow Client CLI

+

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

+ +
+ + + + + + + + + + + +
+ +

4 - Deploy Your First App

+
Deploy an application using drycc cli.
+

Determine Your Host and Hostname Values

+

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.

+

Login to Workflow

+

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
+

Deploy an Application

+

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.

+

Change Application Configuration

+

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
+

Scale Your Application

+

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.

+

Going Further

+

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.

+ + +
+ + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/docs/quickstart/deploy-an-app/index.html b/docs/quickstart/deploy-an-app/index.html new file mode 100644 index 000000000..96fef82d0 --- /dev/null +++ b/docs/quickstart/deploy-an-app/index.html @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + +Deploy Your First App | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Deploy Your First App

+
Deploy an application using drycc cli.
+ +

Determine Your Host and Hostname Values

+

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.

+

Login to Workflow

+

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
+

Deploy an Application

+

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.

+

Change Application Configuration

+

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
+

Scale Your Application

+

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.

+

Going Further

+

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.

+ + + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/quickstart/index.html b/docs/quickstart/index.html new file mode 100644 index 000000000..47ea0ffdf --- /dev/null +++ b/docs/quickstart/index.html @@ -0,0 +1,478 @@ + + + + + + + + + + + + + + + + + + + + + +Quick Start | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Quick Start

+
Step-by-step guides for deploying your first app and mastering the basics of Drycc.
+ + +
+ + +
+
+
+ Quick Start +
+

This guide helps you set up the Drycc workflow.

+
+
+
+ Install Workflow +
+

Install Workflow in pure host, it can be a cloud server, bare metal server, virtual machine, or even your laptop.

+
+
+
+ Drycc Workflow Client CLI +
+

How to download, install Drycc CLI tools.

+
+
+
+ Deploy Your First App +
+

Deploy an application using drycc cli.

+
+
+ +
+ + + + + + +
+ +
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/quickstart/index.xml b/docs/quickstart/index.xml new file mode 100644 index 000000000..e02291e77 --- /dev/null +++ b/docs/quickstart/index.xml @@ -0,0 +1,537 @@ + + + Drycc – Quick Start + /docs/quickstart/ + Recent content in Quick Start on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Docs: Quick Start + /docs/quickstart/overview/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/quickstart/overview/ + + + + <p>Get started with Drycc Workflow in three easy steps.</p> +<ol> +<li>Install CLI tools for Helm and Drycc Workflow</li> +<li>Boot a Kubernetes and install Drycc Workflow</li> +<li>Deploy your first application</li> +</ol> +<p>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 <a href="/docs/managing-workflow/production-deployments/">production checklist</a>.</p> +<h2 id="step-1-install-workflow">Step 1: Install Workflow<a class="td-heading-self-link" href="#step-1-install-workflow" aria-label="Heading self-link"></a></h2> +<p>For the quickstart we will <a href="/docs/quickstart/install-workflow/">install Drycc Workflow</a>.</p> +<h2 id="step-2-install-cli-tools">Step 2: Install CLI tools<a class="td-heading-self-link" href="#step-2-install-cli-tools" aria-label="Heading self-link"></a></h2> +<p>For the quickstart we will <a href="/docs/quickstart/install-cli-tools/">install Drycc Workflow CLI</a>.</p> +<h2 id="step-3-deploy-your-first-app">Step 3: Deploy your first app<a class="td-heading-self-link" href="#step-3-deploy-your-first-app" aria-label="Heading self-link"></a></h2> +<p>Last but not least, <a href="/docs/quickstart/deploy-an-app/">login and deploy your first application</a>.</p> + + + + + + Docs: Install Workflow + /docs/quickstart/install-workflow/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/quickstart/install-workflow/ + + + + <p>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.</p> +<h2 id="operating-systems">Operating Systems<a class="td-heading-self-link" href="#operating-systems" aria-label="Heading self-link"></a></h2> +<p>Drycc is expected to work on most modern Linux systems. Some OSS have specific requirements:</p> +<ul> +<li>(Red Hat/CentOS) Enterprise Linux, they usually use RPM package management.</li> +<li>Ubuntu (Desktop/Server/Cloud) Linux, a very popular distribution.</li> +<li>Debian GNU Linux, a very pure distribution of opensource software.</li> +</ul> +<p>If you want to add more Linux distribution support, please submit a issue on github or submit PR directly.</p> +<h2 id="system-software">System Software<a class="td-heading-self-link" href="#system-software" aria-label="Heading self-link"></a></h2> +<p>Some basic software needs to be installed before installing drycc workflow.</p> +<h3 id="os-configuration">OS configuration<a class="td-heading-self-link" href="#os-configuration" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<h3 id="installing-nfsv4-client">Installing NFSv4 client<a class="td-heading-self-link" href="#installing-nfsv4-client" aria-label="Heading self-link"></a></h3> +<p>The command used to install a NFSv4 client differs depending on the Linux distribution.</p> +<p>For Debian and Ubuntu, use this command:</p> +<pre tabindex="0"><code>$ apt-get install nfs-common +</code></pre><p>For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:</p> +<pre tabindex="0"><code>$ yum install nfs-utils +</code></pre><h3 id="installing-curl">Installing curl<a class="td-heading-self-link" href="#installing-curl" aria-label="Heading self-link"></a></h3> +<p>For Debian and Ubuntu, use this command:</p> +<pre tabindex="0"><code>$ apt-get install curl +</code></pre><p>For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:</p> +<pre tabindex="0"><code>$ yum install curl +</code></pre><h2 id="hardware">Hardware<a class="td-heading-self-link" href="#hardware" aria-label="Heading self-link"></a></h2> +<p>Hardware requirements scale based on the size of your deployments. Minimum recommendations are outlined here.</p> +<ul> +<li>RAM: 1G Minimum (we recommend at least 2GB)</li> +<li>CPU: 1 Minimum</li> +</ul> +<p>This configuration only contains the minimum requirements that can meet the operation.</p> +<h2 id="disk">Disk<a class="td-heading-self-link" href="#disk" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<h2 id="domain-name">Domain Name<a class="td-heading-self-link" href="#domain-name" aria-label="Heading self-link"></a></h2> +<p>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 <code>*.dryccdoman.com</code>. +We need to set the <code>PLATFORM_DOMAIN</code> environment variables before installation.</p> +<pre tabindex="0"><code>$ export PLATFORM_DOMAIN=dryccdoman.co +</code></pre><p>Of course, if it is a test environment, we can also use <code>nip.io</code>, an IP to domain name service. +For example, your host IP is <code>59.46.3.190</code>, we will get the following domain name <code>59.46.3.190.nip.io</code></p> +<pre tabindex="0"><code>$ export PLATFORM_DOMAIN=59.46.3.190.nip.io +</code></pre><h2 id="install">Install<a class="td-heading-self-link" href="#install" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<pre tabindex="0"><code>$ export CERT_MANAGER_ENABLED=false +</code></pre><p>Then you can use the installation script available at <a href="https://www.drycc.cc/install.sh">https://www.drycc.cc/install.sh</a> to install drycc as a service on systemd and openrc based systems.</p> +<pre tabindex="0"><code>$ curl -sfL https://www.drycc.cc/install.sh | bash - +</code></pre><p>!!! important +If you are in China, you need to use mirror acceleration:</p> +<pre><code>``` +$ curl -sfL https://www.drycc.cc/install.sh | INSTALL_DRYCC_MIRROR=cn bash - +``` +</code></pre> +<h3 id="install-node">Install Node<a class="td-heading-self-link" href="#install-node" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<ul> +<li>First, check the cluster token of the master.</li> +</ul> +<pre tabindex="0"><code>$ cat /var/lib/rancher/k3s/server/node-token +K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa +</code></pre><p>We assume that the IP address of the cluster master is <code>192.168.6.240</code>, in that way.</p> +<ul> +<li>Then, Set the environment variable:</li> +</ul> +<pre tabindex="0"><code>$ export K3S_URL=https://192.168.6.240:6443 +$ export K3S_TOKEN=&#34;K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa&#34; +</code></pre><p>!!! important +If you are in China, you need to use mirror acceleration:</p> +<pre><code>``` +$ export INSTALL_DRYCC_MIRROR=cn +``` +</code></pre> +<ul> +<li>Join the cluster as server:</li> +</ul> +<pre tabindex="0"><code>$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_server +</code></pre><ul> +<li>Join the cluster as agent:</li> +</ul> +<pre tabindex="0"><code>$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_agent +</code></pre><h3 id="install-options">Install Options<a class="td-heading-self-link" href="#install-options" aria-label="Heading self-link"></a></h3> +<p>When using this method to install drycc, the following environment variables can be used to configure the installation:</p> +<table> +<thead> +<tr> +<th>ENVIRONMENT VARIABLE</th> +<th>DESCRIPTION</th> +</tr> +</thead> +<tbody> +<tr> +<td>PLATFORM_DOMAIN</td> +<td>Required item, specify drycc&rsquo;s domain name</td> +</tr> +<tr> +<td>DRYCC_ADMIN_USERNAME</td> +<td>Required item, specify drycc&rsquo;s admin username</td> +</tr> +<tr> +<td>DRYCC_ADMIN_PASSWORD</td> +<td>Required item, specify drycc&rsquo;s admin password</td> +</tr> +<tr> +<td>CERT_MANAGER_ENABLED</td> +<td>Whether to use automatic certificate. It is <code>false</code> by default</td> +</tr> +<tr> +<td>CHANNEL</td> +<td>By default, <code>stable</code> channel will be installed. You can also specify <code>testing</code></td> +</tr> +<tr> +<td>REGISTRY_FILE</td> +<td>The <code>config.yaml</code> file path used by k3s containers registry</td> +</tr> +<tr> +<td>KUBERNETES_SERVICE_HOST</td> +<td>Set with the HOST of the loadbalancer that was in front of kube-apiserver</td> +</tr> +<tr> +<td>KUBERNETES_SERVICE_PORT</td> +<td>Set with the PORT of the loadbalancer that was in front of kube-apiserver</td> +</tr> +<tr> +<td>METALLB_CONFIG_FILE</td> +<td>The metallb config file path, layer 2 network is used by default</td> +</tr> +<tr> +<td>INSTALL_DRYCC_MIRROR</td> +<td>Specify the accelerated mirror location. Currently, only <code>cn</code> is supported</td> +</tr> +<tr> +<td>BUILDER_REPLICAS</td> +<td>Number of builder replicas to deploy</td> +</tr> +<tr> +<td>CONTROLLER_API_REPLICAS</td> +<td>Number of controller api replicas to deploy</td> +</tr> +<tr> +<td>CONTROLLER_CELERY_REPLICAS</td> +<td>Number of controller celery replicas to deploy</td> +</tr> +<tr> +<td>CONTROLLER_WEBHOOK_REPLICAS</td> +<td>Number of controller webhook replicas to deploy</td> +</tr> +<tr> +<td>CONTROLLER_APP_RUNTIME_CLASS</td> +<td>RuntimeClass is a feature for selecting the container runtime configuration.</td> +</tr> +<tr> +<td>CONTROLLER_APP_STORAGE_CLASS</td> +<td>StorageClass allocated by <code>drycc volumes</code>; default storageClass is used by default</td> +</tr> +<tr> +<td>REDIS_REPLICAS</td> +<td>Number of redis replicas to deploy</td> +</tr> +<tr> +<td>REDIS_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>redis</code>, which is <code>5Gi</code> by default</td> +</tr> +<tr> +<td>REDIS_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>redis</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>STORAGE_CSI_STATEFULSET_REPLICAS</td> +<td>Number of storage csi controller replicas to deploy</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_TIPD_REPLICAS</td> +<td>Number of storage mainode tipd replicas to deploy</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_TIPD_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>mainnode tipd</code>, which is <code>10Gi</code> by default</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_TIPD_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>mainnode tipd</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_WEED_REPLICAS</td> +<td>Number of storage mainode weed replicas to deploy</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_WEED_PREALLOCATE</td> +<td>Preallocate disk space for volumes, <code>false</code> is used by default</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_WEED_SIZE_LIMIT_MB</td> +<td>Master stops directing writes to oversized volumes, <code>30000</code> is used by default</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_WEED_DEFAULT_REPLICATION</td> +<td>default replication type if not specified, which is <code>000</code> by default</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_WEED_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>mainnode weed</code>, which is <code>10Gi</code> by default</td> +</tr> +<tr> +<td>STORAGE_MAINNODE_WEED_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>mainnode weed</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>STORAGE_METANODE_TIKV_REPLICAS</td> +<td>Number of storage metanode tikv replicas to deploy</td> +</tr> +<tr> +<td>STORAGE_METANODE_TIKV_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>metanode tikv</code>, which is <code>10Gi</code> by default</td> +</tr> +<tr> +<td>STORAGE_METANODE_TIKV_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>mainnode tikv</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>STORAGE_METANODE_WEED_REPLICAS</td> +<td>Number of storage metanode weed replicas to deploy</td> +</tr> +<tr> +<td>STORAGE_METANODE_WEED_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>metanode weed</code>, which is <code>10Gi</code> by default</td> +</tr> +<tr> +<td>STORAGE_METANODE_WEED_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>mainnode weed</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>STORAGE_DATANODE_WEED_REPLICAS</td> +<td>Number of storage datanode weed replicas to deploy</td> +</tr> +<tr> +<td>STORAGE_DATANODE_WEED_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>datanode weed</code>, which is <code>20Gi</code> by default</td> +</tr> +<tr> +<td>STORAGE_DATANODE_WEED_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>datanode weed</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>MONITOR_GRAFANA_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>monitor.grafana</code>, which is <code>5Gi</code> by default</td> +</tr> +<tr> +<td>MONITOR_GRAFANA_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>monitor</code> grafana; default storangeclass is used by default</td> +</tr> +<tr> +<td>LOGGER_REPLICAS</td> +<td>Number of logger replicas to deploy</td> +</tr> +<tr> +<td>RABBITMQ_REPLICAS</td> +<td>Number of rabbitmq replicas to deploy</td> +</tr> +<tr> +<td>RABBITMQ_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>rabbitmq</code>, which is <code>5Gi</code> by default</td> +</tr> +<tr> +<td>RABBITMQ_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>rabbitmq</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>DATABASE_REPLICAS</td> +<td>Number of database replicas to deploy</td> +</tr> +<tr> +<td>DATABASE_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>database</code>, which is <code>5Gi</code> by default</td> +</tr> +<tr> +<td>DATABASE_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>database</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>TIMESERIES_REPLICAS</td> +<td>Number of timeseries replicas to deploy</td> +</tr> +<tr> +<td>TIMESERIES_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>timeseries</code>, which is <code>5Gi</code> by default</td> +</tr> +<tr> +<td>TIMESERIES_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>timeseries</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>PASSPORT_REPLICAS</td> +<td>Number of passport replicas to deploy</td> +</tr> +<tr> +<td>REGISTRY_REPLICAS</td> +<td>Number of registry replicas to deploy</td> +</tr> +<tr> +<td>HELMBROKER_REPLICAS</td> +<td>Number of helmbroker api replicas to deploy</td> +</tr> +<tr> +<td>HELMBROKER_CELERY_REPLICAS</td> +<td>Number of helmbroker celery replicas to deploy</td> +</tr> +<tr> +<td>HELMBROKER_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>helmbroker</code>, which is <code>5Gi</code> by default</td> +</tr> +<tr> +<td>HELMBROKER_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>helmbroker</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>PROMETHEUS_SERVER_RETENTION</td> +<td>Prometheus data retention period (default if not specified is 15 days)</td> +</tr> +<tr> +<td>PROMETHEUS_SERVER_PERSISTENCE_SIZE</td> +<td>The size of the persistence space allocated to <code>prometheus-server</code>, which is <code>10Gi</code> by default</td> +</tr> +<tr> +<td>PROMETHEUS_SERVER_PERSISTENCE_STORAGE_CLASS</td> +<td>StorangeClass of <code>prometheus-server</code>; default storangeclass is used by default</td> +</tr> +<tr> +<td>K3S_DATA_DIR</td> +<td>The config of k3s data dir; If not set, the default path is used</td> +</tr> +<tr> +<td>ACME_SERVER</td> +<td>ACME Server url, default use letsencrypt</td> +</tr> +<tr> +<td>ACME_EAB_KEY_ID</td> +<td>The key ID of which your external account binding is indexed by the external account</td> +</tr> +<tr> +<td>ACME_EAB_KEY_SECRET</td> +<td>The key Secret of which your external account symmetric MAC key</td> +</tr> +</tbody> +</table> +<p>Since the installation script will install k3s, other environment variables can refer to k3s installation <a href="https://rancher.com/docs/k3s/latest/en/installation/install-options/">environment variables</a>.</p> +<h2 id="uninstall">Uninstall<a class="td-heading-self-link" href="#uninstall" aria-label="Heading self-link"></a></h2> +<p>If you installed drycc using an installation script, you can uninstall the entire drycc using this script.</p> +<pre tabindex="0"><code>$ curl -sfL https://www.drycc.cc/uninstall.sh | bash - +</code></pre> + + + + + Docs: Drycc Workflow Client CLI + /docs/quickstart/install-cli-tools/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/quickstart/install-cli-tools/ + + + + <h2 id="drycc-workflow-client-cli">Drycc Workflow Client CLI<a class="td-heading-self-link" href="#drycc-workflow-client-cli" aria-label="Heading self-link"></a></h2> +<p>The Drycc command-line interface (CLI), lets you interact with Drycc Workflow. +Use the CLI to create and configure and manage applications.</p> +<p>Install the <code>drycc</code> client for Linux or Mac OS X with:</p> +<pre tabindex="0"><code>$ curl -sfL https://www.drycc.cc/install-cli.sh | bash - +</code></pre><p>!!! important +Users in Chinese mainland can use the following methods to speed up installation:</p> +<pre><code>``` +$ curl -sfL https://www.drycc.cc/install-cli.sh | INSTALL_DRYCC_MIRROR=cn bash - +``` +</code></pre> +<p>Others please visit: <a href="https://github.com/drycc/workflow-cli/releases">https://github.com/drycc/workflow-cli/releases</a></p> +<p>The installer places the <code>drycc</code> binary in your current directory, but you +should move it somewhere in your $PATH:</p> +<pre tabindex="0"><code>$ sudo ln -fs $PWD/drycc /usr/local/bin/drycc +</code></pre><p><em>or</em>:</p> +<pre tabindex="0"><code>$ sudo mv $PWD/drycc /usr/local/bin/drycc +</code></pre><p>Check your work by running <code>drycc version</code>:</p> +<pre tabindex="0"><code>$ drycc version +v1.1.0 +</code></pre><p>Update workflow cli to latest release.</p> +<pre tabindex="0"><code>drycc update +</code></pre><p>!!! note +Note that version numbers may vary as new releases become available</p> + + + + + + Docs: Deploy Your First App + /docs/quickstart/deploy-an-app/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/quickstart/deploy-an-app/ + + + + <h2 id="determine-your-host-and-hostname-values">Determine Your Host and Hostname Values<a class="td-heading-self-link" href="#determine-your-host-and-hostname-values" aria-label="Heading self-link"></a></h2> +<p>Drycc workflow requires a wildcard DNS record to dynamically map app names to the router.</p> +<p>User should already have DNS set up pointing to their known host. The <code>$hostname</code> value can be calculated by prepending <code>drycc.</code> to the value set in <code>global.platformDomain</code>.</p> +<h2 id="login-to-workflow">Login to Workflow<a class="td-heading-self-link" href="#login-to-workflow" aria-label="Heading self-link"></a></h2> +<p>Workflow use the passport component to create and authorize users. +If you already have an account, use <code>drycc login</code> to authenticate against the Drycc Workflow API.</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Or you can login with username and password</p> +<pre tabindex="0"><code>$ drycc login http://drycc.example.com --username=demo --password=demo +Configuration file written to /root/.drycc/client.json +</code></pre><h2 id="deploy-an-application">Deploy an Application<a class="td-heading-self-link" href="#deploy-an-application" aria-label="Heading self-link"></a></h2> +<p>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&rsquo;t have to wrestle with checking out code.</p> +<p>Run <code>drycc create</code> 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.</p> +<pre tabindex="0"><code>$ 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` +</code></pre><p>Our application has been created and named <code>proper-barbecue</code>. As with the +<code>drycc</code> hostname, any HTTP traffic to <code>proper-barbecue</code> will be automatically +routed to your application pods by the edge router.</p> +<p>Let&rsquo;s use the CLI to tell the platform to deploy an application and then use curl to send a request to the app:</p> +<pre tabindex="0"><code>$ drycc pull drycc/example-go -a proper-barbecue +Creating build... done +$ curl http://proper-barbecue.$hostname +Powered by Drycc +</code></pre><p>!!! note +If you see a 404 error, make sure you specified your application name with <code>-a &lt;appname&gt;</code>!</p> +<p>Workflow&rsquo;s edge router knows all about application names and automatically +sends traffic to the right application. The router sends traffic for +<code>proper-barbecue.104.197.125.75.nip.io</code> to your app, just like +<code>drycc.104.197.125.75.nip.io</code> was sent to the Workflow API service.</p> +<h2 id="change-application-configuration">Change Application Configuration<a class="td-heading-self-link" href="#change-application-configuration" aria-label="Heading self-link"></a></h2> +<p>Next, let&rsquo;s change some configuration using the CLI. Our example app is built +to read configuration from the environment. By using <code>drycc config:set</code> we can +change how the application behaves:</p> +<pre tabindex="0"><code>$ drycc config:set POWERED_BY=&#34;Container Images + Kubernetes&#34; -a proper-barbecue +Creating config... done + +UUID OWNER NAME VALUE +04bb6e45-9221-4843-a1f9-acc7fded3b06 dev POWERED_BY Container Images + Kubernetes +</code></pre><p>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!</p> +<p>Validate that our configuration change has worked:</p> +<pre tabindex="0"><code>$ curl http://proper-barbecue.104.197.125.75.nip.io +Powered by Container Images + Kubernetes +</code></pre><h2 id="scale-your-application">Scale Your Application<a class="td-heading-self-link" href="#scale-your-application" aria-label="Heading self-link"></a></h2> +<p>Last, let&rsquo;s scale our application by adding more application processes. Using the CLI you can easily add and remove +additional processes to service requests:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Congratulations! You have deployed, configured, and scaled your first application using Drycc Workflow.</p> +<h2 id="going-further">Going Further<a class="td-heading-self-link" href="#going-further" aria-label="Heading self-link"></a></h2> +<p>There is a lot more you can do with Drycc Workflow, play around with the CLI:</p> +<p>!!! 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 <a href="/docs/users/ssh-keys/">Users and SSH Keys</a> and <a href="/docs/troubleshooting/">Troubleshooting Workflow</a>.</p> +<ul> +<li>Roll back to a previous release with <code>drycc rollback -a proper-barbecue</code></li> +<li>See application logs with <code>drycc logs -a proper-barbecue</code></li> +<li>Try one of our other example applications like: +<ul> +<li><a href="https://github.com/drycc/ruby-getting-started">drycc/ruby-getting-started</a></li> +<li><a href="https://github.com/drycc/python-getting-started">drycc/python-getting-started</a></li> +<li><a href="https://github.com/drycc/php-getting-started">drycc/php-getting-started</a></li> +</ul> +</li> +<li>Read about using application <a href="/docs/applications/using-buildpacks/">Buildpacks</a> or <a href="/docs/applications/using-dockerfiles/">Dockerfiles</a></li> +<li>Join our <a href="https://drycc.slack.com/">#community slack channel</a> and meet the team!</li> +</ul> + + + + + + diff --git a/docs/quickstart/install-cli-tools/index.html b/docs/quickstart/install-cli-tools/index.html new file mode 100644 index 000000000..c14b011ef --- /dev/null +++ b/docs/quickstart/install-cli-tools/index.html @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow Client CLI | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Drycc Workflow Client CLI

+
How to download, install Drycc CLI tools.
+ +

Drycc Workflow Client CLI

+

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

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/quickstart/install-workflow/index.html b/docs/quickstart/install-workflow/index.html new file mode 100644 index 000000000..e44a4ad6f --- /dev/null +++ b/docs/quickstart/install-workflow/index.html @@ -0,0 +1,826 @@ + + + + + + + + + + + + + + + + + + + +Install Workflow | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Install Workflow

+
Install Workflow in pure host, it can be a cloud server, bare metal server, virtual machine, or even your laptop.
+ +

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.

+

Operating Systems

+

Drycc is expected to work on most modern Linux systems. Some OSS have specific requirements:

+
    +
  • (Red Hat/CentOS) Enterprise Linux, they usually use RPM package management.
  • +
  • Ubuntu (Desktop/Server/Cloud) Linux, a very popular distribution.
  • +
  • Debian GNU Linux, a very pure distribution of opensource software.
  • +
+

If you want to add more Linux distribution support, please submit a issue on github or submit PR directly.

+

System Software

+

Some basic software needs to be installed before installing drycc workflow.

+

OS configuration

+

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.

+

Installing NFSv4 client

+

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
+

Installing curl

+

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

+

Hardware requirements scale based on the size of your deployments. Minimum recommendations are outlined here.

+
    +
  • RAM: 1G Minimum (we recommend at least 2GB)
  • +
  • CPU: 1 Minimum
  • +
+

This configuration only contains the minimum requirements that can meet the operation.

+

Disk

+

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.

+

Domain Name

+

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
+

Install

+

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 -
+```
+
+

Install Node

+

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.

+
    +
  • First, check the cluster token of the master.
  • +
+
$ 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.

+
    +
  • Then, Set the environment variable:
  • +
+
$ 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
+```
+
+
    +
  • Join the cluster as server:
  • +
+
$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_server
+
    +
  • Join the cluster as agent:
  • +
+
$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_agent
+

Install Options

+

When using this method to install drycc, the following environment variables can be used to configure the installation:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ENVIRONMENT VARIABLEDESCRIPTION
PLATFORM_DOMAINRequired item, specify drycc’s domain name
DRYCC_ADMIN_USERNAMERequired item, specify drycc’s admin username
DRYCC_ADMIN_PASSWORDRequired item, specify drycc’s admin password
CERT_MANAGER_ENABLEDWhether to use automatic certificate. It is false by default
CHANNELBy default, stable channel will be installed. You can also specify testing
REGISTRY_FILEThe config.yaml file path used by k3s containers registry
KUBERNETES_SERVICE_HOSTSet with the HOST of the loadbalancer that was in front of kube-apiserver
KUBERNETES_SERVICE_PORTSet with the PORT of the loadbalancer that was in front of kube-apiserver
METALLB_CONFIG_FILEThe metallb config file path, layer 2 network is used by default
INSTALL_DRYCC_MIRRORSpecify the accelerated mirror location. Currently, only cn is supported
BUILDER_REPLICASNumber of builder replicas to deploy
CONTROLLER_API_REPLICASNumber of controller api replicas to deploy
CONTROLLER_CELERY_REPLICASNumber of controller celery replicas to deploy
CONTROLLER_WEBHOOK_REPLICASNumber of controller webhook replicas to deploy
CONTROLLER_APP_RUNTIME_CLASSRuntimeClass is a feature for selecting the container runtime configuration.
CONTROLLER_APP_STORAGE_CLASSStorageClass allocated by drycc volumes; default storageClass is used by default
REDIS_REPLICASNumber of redis replicas to deploy
REDIS_PERSISTENCE_SIZEThe size of the persistence space allocated to redis, which is 5Gi by default
REDIS_PERSISTENCE_STORAGE_CLASSStorangeClass of redis; default storangeclass is used by default
STORAGE_CSI_STATEFULSET_REPLICASNumber of storage csi controller replicas to deploy
STORAGE_MAINNODE_TIPD_REPLICASNumber of storage mainode tipd replicas to deploy
STORAGE_MAINNODE_TIPD_PERSISTENCE_SIZEThe size of the persistence space allocated to mainnode tipd, which is 10Gi by default
STORAGE_MAINNODE_TIPD_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode tipd; default storangeclass is used by default
STORAGE_MAINNODE_WEED_REPLICASNumber of storage mainode weed replicas to deploy
STORAGE_MAINNODE_WEED_PREALLOCATEPreallocate disk space for volumes, false is used by default
STORAGE_MAINNODE_WEED_SIZE_LIMIT_MBMaster stops directing writes to oversized volumes, 30000 is used by default
STORAGE_MAINNODE_WEED_DEFAULT_REPLICATIONdefault replication type if not specified, which is 000 by default
STORAGE_MAINNODE_WEED_PERSISTENCE_SIZEThe size of the persistence space allocated to mainnode weed, which is 10Gi by default
STORAGE_MAINNODE_WEED_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode weed; default storangeclass is used by default
STORAGE_METANODE_TIKV_REPLICASNumber of storage metanode tikv replicas to deploy
STORAGE_METANODE_TIKV_PERSISTENCE_SIZEThe size of the persistence space allocated to metanode tikv, which is 10Gi by default
STORAGE_METANODE_TIKV_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode tikv; default storangeclass is used by default
STORAGE_METANODE_WEED_REPLICASNumber of storage metanode weed replicas to deploy
STORAGE_METANODE_WEED_PERSISTENCE_SIZEThe size of the persistence space allocated to metanode weed, which is 10Gi by default
STORAGE_METANODE_WEED_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode weed; default storangeclass is used by default
STORAGE_DATANODE_WEED_REPLICASNumber of storage datanode weed replicas to deploy
STORAGE_DATANODE_WEED_PERSISTENCE_SIZEThe size of the persistence space allocated to datanode weed, which is 20Gi by default
STORAGE_DATANODE_WEED_PERSISTENCE_STORAGE_CLASSStorangeClass of datanode weed; default storangeclass is used by default
MONITOR_GRAFANA_PERSISTENCE_SIZEThe size of the persistence space allocated to monitor.grafana, which is 5Gi by default
MONITOR_GRAFANA_PERSISTENCE_STORAGE_CLASSStorangeClass of monitor grafana; default storangeclass is used by default
LOGGER_REPLICASNumber of logger replicas to deploy
RABBITMQ_REPLICASNumber of rabbitmq replicas to deploy
RABBITMQ_PERSISTENCE_SIZEThe size of the persistence space allocated to rabbitmq, which is 5Gi by default
RABBITMQ_PERSISTENCE_STORAGE_CLASSStorangeClass of rabbitmq; default storangeclass is used by default
DATABASE_REPLICASNumber of database replicas to deploy
DATABASE_PERSISTENCE_SIZEThe size of the persistence space allocated to database, which is 5Gi by default
DATABASE_PERSISTENCE_STORAGE_CLASSStorangeClass of database; default storangeclass is used by default
TIMESERIES_REPLICASNumber of timeseries replicas to deploy
TIMESERIES_PERSISTENCE_SIZEThe size of the persistence space allocated to timeseries, which is 5Gi by default
TIMESERIES_PERSISTENCE_STORAGE_CLASSStorangeClass of timeseries; default storangeclass is used by default
PASSPORT_REPLICASNumber of passport replicas to deploy
REGISTRY_REPLICASNumber of registry replicas to deploy
HELMBROKER_REPLICASNumber of helmbroker api replicas to deploy
HELMBROKER_CELERY_REPLICASNumber of helmbroker celery replicas to deploy
HELMBROKER_PERSISTENCE_SIZEThe size of the persistence space allocated to helmbroker, which is 5Gi by default
HELMBROKER_PERSISTENCE_STORAGE_CLASSStorangeClass of helmbroker; default storangeclass is used by default
PROMETHEUS_SERVER_RETENTIONPrometheus data retention period (default if not specified is 15 days)
PROMETHEUS_SERVER_PERSISTENCE_SIZEThe size of the persistence space allocated to prometheus-server, which is 10Gi by default
PROMETHEUS_SERVER_PERSISTENCE_STORAGE_CLASSStorangeClass of prometheus-server; default storangeclass is used by default
K3S_DATA_DIRThe config of k3s data dir; If not set, the default path is used
ACME_SERVERACME Server url, default use letsencrypt
ACME_EAB_KEY_IDThe key ID of which your external account binding is indexed by the external account
ACME_EAB_KEY_SECRETThe 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.

+

Uninstall

+

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 -
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/quickstart/overview/index.html b/docs/quickstart/overview/index.html new file mode 100644 index 000000000..2001773e9 --- /dev/null +++ b/docs/quickstart/overview/index.html @@ -0,0 +1,474 @@ + + + + + + + + + + + + + + + + + + + +Quick Start | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Quick Start

+
This guide helps you set up the Drycc workflow.
+ +

Get started with Drycc Workflow in three easy steps.

+
    +
  1. Install CLI tools for Helm and Drycc Workflow
  2. +
  3. Boot a Kubernetes and install Drycc Workflow
  4. +
  5. Deploy your first application
  6. +
+

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.

+

Step 1: Install Workflow

+

For the quickstart we will install Drycc Workflow.

+

Step 2: Install CLI tools

+

For the quickstart we will install Drycc Workflow CLI.

+

Step 3: Deploy your first app

+

Last but not least, login and deploy your first application.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/reference-guide/_print/index.html b/docs/reference-guide/_print/index.html new file mode 100644 index 000000000..a185420c8 --- /dev/null +++ b/docs/reference-guide/_print/index.html @@ -0,0 +1,4301 @@ + + + + + + + + + + + + + + + + + + + + + +Reference Guide | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Reference Guide

+
Reference gxwuide definition and meaning.
+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + +
+ +

1 - Creating a Self-Signed SSL Certificate

+
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.
+

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.

+

Prerequisites

+

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 XHomebrew: brew install openssl
Windowscomplete package .exe installed
Ubuntu Linuxapt-get install openssl
+

Generate Private Key and Certificate Signing Request

+

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 []:
+...
+
+

Generate SSL Certificate

+

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.

+ +
+ + + + + + + + + + + +
+ +

2 - Controller API v2.0

+
This is the v2.0 REST API for the Controller.
+

What’s New

+

New! format of POST /v2/apps/<app id>/run has changed.

+

Authentication

+

Register a New User

+

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": []
+}
+

Log in

+

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"}
+

Cancel Account

+

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
+

Regenerate Token

+
+

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"}
+

Change Password

+

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 the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+

Applications

+

List all Applications

+

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"
+        }
+    ]
+}
+

Create an Application

+

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"
+}
+

Destroy an Application

+

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
+

List Application Details

+

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"
+}
+

Update Application Details

+

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
+

Retrieve Application Logs

+

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"
+

Run one-off Commands

+
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"}
+

Certificates

+

List all Certificates

+

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"
+    }
+  ]
+}
+

Get Certificate Details

+

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"
+}
+

Create Certificate

+

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"
+}
+

Destroy a Certificate

+

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
+

Attach a Domain to a Certificate

+

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
+

Remove a Domain from a Certificate

+

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
+

Pods

+

List all Pods

+

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"
+        }
+    ]
+}
+

List all Pods by Type

+

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"
+        }
+    ]
+}
+

Restart All Pods

+

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"
+    }
+]
+

Restart Pods by Type

+

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"
+    }
+]
+

Restart Pods by Type and Name

+

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"
+    }
+]
+

Scale Pods

+

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
+

Configuration

+

List Application Configuration

+

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"
+}
+

Create new Config

+

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"
+}
+

Unset Config Variable

+

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"
+}
+

Domains

+

List Application Domains

+

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"
+        }
+    ]
+}
+

Add Domain

+

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"
+}
+

Remove Domain

+

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
+

Builds

+

List Application Builds

+

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"
+        }
+    ]
+}
+

Create Application Build

+

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"
+}
+

Releases

+

List Application Releases

+

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
+        }
+    ]
+}
+

List Release Details

+

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
+}
+

Rollback Release

+

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}
+

Keys

+

List Keys

+

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"
+        }
+    ]
+}
+

Add Key to User

+

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"
+}
+

Remove Key from User

+

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
+

Permissions

+

List Application Permissions

+
+

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"
+    ]
+}
+

Create Application Permission

+

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
+

Remove Application Permission

+

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
+

List Administrators

+

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
+        }
+    ]
+}
+

Grant User Administrative Privileges

+
+

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
+

Remove User’s Administrative Privileges

+
+

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
+

Users

+

List all users

+
+

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": []
+        }
+    ]
+}
+
+
+ + + + + + + + + + + +
+ +

3 - Controller API v2.1

+
This is the v2.1 REST API for the Controller.
+

What’s New

+

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.

+

Authentication

+

Register a New User

+

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": []
+}
+

Log in

+

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"}
+

Cancel Account

+

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
+

Regenerate Token

+
+

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"}
+

Change Password

+

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 the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+

Applications

+

List all Applications

+

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"
+        }
+    ]
+}
+

Create an Application

+

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"
+}
+

Destroy an Application

+

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
+

List Application Details

+

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"
+}
+

Update Application Details

+

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
+

Retrieve Application Logs

+

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"
+

Run one-off Commands

+
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"}
+

Certificates

+

List all Certificates

+

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"
+    }
+  ]
+}
+

Get Certificate Details

+

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"
+}
+

Create Certificate

+

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"
+}
+

Destroy a Certificate

+

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
+

Attach a Domain to a Certificate

+

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
+

Remove a Domain from a Certificate

+

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
+

Pods

+

List all Pods

+

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"
+        }
+    ]
+}
+

List all Pods by Type

+

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"
+        }
+    ]
+}
+

Restart All Pods

+

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"
+    }
+]
+

Restart Pods by Type

+

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"
+    }
+]
+

Restart Pods by Type and Name

+

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"
+    }
+]
+

Scale Pods

+

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
+

Configuration

+

List Application Configuration

+

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"
+}
+

Create new Config

+

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"
+}
+

Unset Config Variable

+

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"
+}
+

Domains

+

List Application Domains

+

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"
+        }
+    ]
+}
+

Add Domain

+

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"
+}
+

Remove Domain

+

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
+

Builds

+

List Application Builds

+

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"
+        }
+    ]
+}
+

Create Application Build

+

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"
+}
+

Releases

+

List Application Releases

+

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
+        }
+    ]
+}
+

List Release Details

+

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
+}
+

Rollback Release

+

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}
+

Keys

+

List Keys

+

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"
+        }
+    ]
+}
+

Add Key to User

+

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"
+}
+

Remove Key from User

+

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
+

Permissions

+

List Application Permissions

+
+

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"
+    ]
+}
+

Create Application Permission

+

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
+

Remove Application Permission

+

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
+

List Administrators

+

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
+        }
+    ]
+}
+

Grant User Administrative Privileges

+
+

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
+

Remove User’s Administrative Privileges

+
+

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
+

Users

+

List all users

+
+

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": []
+        }
+    ]
+}
+
+
+ + + + + + + + + + + +
+ +

4 - Controller API v2.2

+
This is the v2.2 REST API for the Controller.
+

What’s New

+

New! /v2/auth/whoami endpoint

+

Authentication

+

Register a New User

+

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": []
+}
+

Log in

+

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"}
+

Cancel Account

+

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
+

Who Am I

+

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": []
+}
+

Regenerate Token

+
+

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"}
+

Change Password

+

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 the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+

Applications

+

List all Applications

+

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"
+        }
+    ]
+}
+

Create an Application

+

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"
+}
+

Destroy an Application

+

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
+

List Application Details

+

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"
+}
+

Update Application Details

+

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
+

Retrieve Application Logs

+

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"
+

Run one-off Commands

+
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"}
+

Certificates

+

List all Certificates

+

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"
+    }
+  ]
+}
+

Get Certificate Details

+

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"
+}
+

Create Certificate

+

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"
+}
+

Destroy a Certificate

+

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
+

Attach a Domain to a Certificate

+

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
+

Remove a Domain from a Certificate

+

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
+

Pods

+

List all Pods

+

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"
+        }
+    ]
+}
+

List all Pods by Type

+

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"
+        }
+    ]
+}
+

Restart All Pods

+

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"
+    }
+]
+

Restart Pods by Type

+

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"
+    }
+]
+

Restart Pods by Type and Name

+

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"
+    }
+]
+

Scale Pods

+

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
+

Configuration

+

List Application Configuration

+

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"
+}
+

Create new Config

+

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"
+}
+

Unset Config Variable

+

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"
+}
+

Domains

+

List Application Domains

+

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"
+        }
+    ]
+}
+

Add Domain

+

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"
+}
+

Remove Domain

+

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
+

Builds

+

List Application Builds

+

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"
+        }
+    ]
+}
+

Create Application Build

+

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"
+}
+

Releases

+

List Application Releases

+

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
+        }
+    ]
+}
+

List Release Details

+

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
+}
+

Rollback Release

+

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}
+

Keys

+

List Keys

+

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"
+        }
+    ]
+}
+

Add Key to User

+

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"
+}
+

Remove Key from User

+

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
+

Permissions

+

List Application Permissions

+
+

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"
+    ]
+}
+

Create Application Permission

+

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
+

Remove Application Permission

+

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
+

List Administrators

+

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
+        }
+    ]
+}
+

Grant User Administrative Privileges

+
+

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
+

Remove User’s Administrative Privileges

+
+

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
+

Users

+

List all users

+
+

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": []
+        }
+    ]
+}
+
+
+ + + + + + + + + + + +
+ +

5 - Controller API v2.3

+
This is the v2.3 REST API for the Controller.
+

What’s New

+

New! /v2/apps/{name}/logs endpoint was fixed and no longer returns b'log data' and instead returns a normal string log data

+

Authentication

+

Register a New User

+

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": []
+}
+

Log in

+

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"}
+

Cancel Account

+

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
+

Who Am I

+

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": []
+}
+

Regenerate Token

+
+

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"}
+

Change Password

+

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 the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+

Applications

+

List all Applications

+

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"
+        }
+    ]
+}
+

Create an Application

+

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"
+}
+

Destroy an Application

+

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
+

List Application Details

+

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"
+}
+

Update Application Details

+

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
+

Retrieve Application Logs

+

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"
+

Run one-off Commands

+
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"}
+

Certificates

+

List all Certificates

+

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"
+    }
+  ]
+}
+

Get Certificate Details

+

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"
+}
+

Create Certificate

+

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"
+}
+

Destroy a Certificate

+

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
+

Attach a Domain to a Certificate

+

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
+

Remove a Domain from a Certificate

+

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
+

Enable or disable TLS

+

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"
+}
+

Get TLS status

+

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"
+}
+

Pods

+

List all Pods

+

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"
+        }
+    ]
+}
+

List all Pods by Type

+

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"
+        }
+    ]
+}
+

Restart All Pods

+

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"
+    }
+]
+

Restart Pods by Type

+

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"
+    }
+]
+

Restart Pods by Type and Name

+

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"
+    }
+]
+

Scale Pods

+

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
+

Configuration

+

List Application Configuration

+

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"
+}
+

Create new Config

+

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"
+}
+

Unset Config Variable

+

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"
+}
+

Domains

+

List Application Domains

+

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"
+        }
+    ]
+}
+

Add Domain

+

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"
+}
+

Remove Domain

+

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
+

Builds

+

List Application Builds

+

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"
+        }
+    ]
+}
+

Create Application Build

+

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"
+}
+

Releases

+

List Application Releases

+

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
+        }
+    ]
+}
+

List Release Details

+

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
+}
+

Rollback Release

+

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}
+

Keys

+

List Keys

+

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"
+        }
+    ]
+}
+

Add Key to User

+

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"
+}
+

Remove Key from User

+

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
+

Permissions

+

List Application Permissions

+
+

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"
+    ]
+}
+

Create Application Permission

+

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
+

Remove Application Permission

+

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
+

List Administrators

+

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
+        }
+    ]
+}
+

Grant User Administrative Privileges

+
+

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
+

Remove User’s Administrative Privileges

+
+

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
+

Users

+

List all users

+
+

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": []
+        }
+    ]
+}
+
+
+ + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/docs/reference-guide/controller-api-v2-0/index.html b/docs/reference-guide/controller-api-v2-0/index.html new file mode 100644 index 000000000..bb04c4aac --- /dev/null +++ b/docs/reference-guide/controller-api-v2-0/index.html @@ -0,0 +1,1507 @@ + + + + + + + + + + + + + + + + + + + +Controller API v2.0 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Controller API v2.0

+
This is the v2.0 REST API for the Controller.
+ +

What’s New

+

New! format of POST /v2/apps/<app id>/run has changed.

+

Authentication

+

Register a New User

+

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": []
+}
+

Log in

+

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"}
+

Cancel Account

+

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
+

Regenerate Token

+
+

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"}
+

Change Password

+

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 the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+

Applications

+

List all Applications

+

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"
+        }
+    ]
+}
+

Create an Application

+

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"
+}
+

Destroy an Application

+

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
+

List Application Details

+

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"
+}
+

Update Application Details

+

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
+

Retrieve Application Logs

+

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"
+

Run one-off Commands

+
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"}
+

Certificates

+

List all Certificates

+

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"
+    }
+  ]
+}
+

Get Certificate Details

+

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"
+}
+

Create Certificate

+

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"
+}
+

Destroy a Certificate

+

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
+

Attach a Domain to a Certificate

+

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
+

Remove a Domain from a Certificate

+

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
+

Pods

+

List all Pods

+

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"
+        }
+    ]
+}
+

List all Pods by Type

+

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"
+        }
+    ]
+}
+

Restart All Pods

+

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"
+    }
+]
+

Restart Pods by Type

+

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"
+    }
+]
+

Restart Pods by Type and Name

+

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"
+    }
+]
+

Scale Pods

+

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
+

Configuration

+

List Application Configuration

+

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"
+}
+

Create new Config

+

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"
+}
+

Unset Config Variable

+

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"
+}
+

Domains

+

List Application Domains

+

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"
+        }
+    ]
+}
+

Add Domain

+

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"
+}
+

Remove Domain

+

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
+

Builds

+

List Application Builds

+

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"
+        }
+    ]
+}
+

Create Application Build

+

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"
+}
+

Releases

+

List Application Releases

+

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
+        }
+    ]
+}
+

List Release Details

+

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
+}
+

Rollback Release

+

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}
+

Keys

+

List Keys

+

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"
+        }
+    ]
+}
+

Add Key to User

+

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"
+}
+

Remove Key from User

+

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
+

Permissions

+

List Application Permissions

+
+

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"
+    ]
+}
+

Create Application Permission

+

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
+

Remove Application Permission

+

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
+

List Administrators

+

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
+        }
+    ]
+}
+

Grant User Administrative Privileges

+
+

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
+

Remove User’s Administrative Privileges

+
+

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
+

Users

+

List all users

+
+

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": []
+        }
+    ]
+}
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/reference-guide/controller-api-v2-1/index.html b/docs/reference-guide/controller-api-v2-1/index.html new file mode 100644 index 000000000..26c224a13 --- /dev/null +++ b/docs/reference-guide/controller-api-v2-1/index.html @@ -0,0 +1,1506 @@ + + + + + + + + + + + + + + + + + + + +Controller API v2.1 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Controller API v2.1

+
This is the v2.1 REST API for the Controller.
+ +

What’s New

+

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.

+

Authentication

+

Register a New User

+

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": []
+}
+

Log in

+

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"}
+

Cancel Account

+

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
+

Regenerate Token

+
+

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"}
+

Change Password

+

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 the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+

Applications

+

List all Applications

+

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"
+        }
+    ]
+}
+

Create an Application

+

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"
+}
+

Destroy an Application

+

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
+

List Application Details

+

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"
+}
+

Update Application Details

+

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
+

Retrieve Application Logs

+

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"
+

Run one-off Commands

+
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"}
+

Certificates

+

List all Certificates

+

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"
+    }
+  ]
+}
+

Get Certificate Details

+

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"
+}
+

Create Certificate

+

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"
+}
+

Destroy a Certificate

+

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
+

Attach a Domain to a Certificate

+

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
+

Remove a Domain from a Certificate

+

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
+

Pods

+

List all Pods

+

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"
+        }
+    ]
+}
+

List all Pods by Type

+

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"
+        }
+    ]
+}
+

Restart All Pods

+

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"
+    }
+]
+

Restart Pods by Type

+

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"
+    }
+]
+

Restart Pods by Type and Name

+

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"
+    }
+]
+

Scale Pods

+

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
+

Configuration

+

List Application Configuration

+

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"
+}
+

Create new Config

+

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"
+}
+

Unset Config Variable

+

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"
+}
+

Domains

+

List Application Domains

+

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"
+        }
+    ]
+}
+

Add Domain

+

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"
+}
+

Remove Domain

+

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
+

Builds

+

List Application Builds

+

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"
+        }
+    ]
+}
+

Create Application Build

+

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"
+}
+

Releases

+

List Application Releases

+

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
+        }
+    ]
+}
+

List Release Details

+

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
+}
+

Rollback Release

+

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}
+

Keys

+

List Keys

+

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"
+        }
+    ]
+}
+

Add Key to User

+

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"
+}
+

Remove Key from User

+

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
+

Permissions

+

List Application Permissions

+
+

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"
+    ]
+}
+

Create Application Permission

+

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
+

Remove Application Permission

+

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
+

List Administrators

+

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
+        }
+    ]
+}
+

Grant User Administrative Privileges

+
+

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
+

Remove User’s Administrative Privileges

+
+

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
+

Users

+

List all users

+
+

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": []
+        }
+    ]
+}
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/reference-guide/controller-api-v2-2/index.html b/docs/reference-guide/controller-api-v2-2/index.html new file mode 100644 index 000000000..239c35678 --- /dev/null +++ b/docs/reference-guide/controller-api-v2-2/index.html @@ -0,0 +1,1530 @@ + + + + + + + + + + + + + + + + + + + +Controller API v2.2 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Controller API v2.2

+
This is the v2.2 REST API for the Controller.
+ +

What’s New

+

New! /v2/auth/whoami endpoint

+

Authentication

+

Register a New User

+

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": []
+}
+

Log in

+

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"}
+

Cancel Account

+

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
+

Who Am I

+

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": []
+}
+

Regenerate Token

+
+

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"}
+

Change Password

+

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 the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+

Applications

+

List all Applications

+

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"
+        }
+    ]
+}
+

Create an Application

+

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"
+}
+

Destroy an Application

+

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
+

List Application Details

+

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"
+}
+

Update Application Details

+

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
+

Retrieve Application Logs

+

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"
+

Run one-off Commands

+
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"}
+

Certificates

+

List all Certificates

+

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"
+    }
+  ]
+}
+

Get Certificate Details

+

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"
+}
+

Create Certificate

+

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"
+}
+

Destroy a Certificate

+

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
+

Attach a Domain to a Certificate

+

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
+

Remove a Domain from a Certificate

+

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
+

Pods

+

List all Pods

+

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"
+        }
+    ]
+}
+

List all Pods by Type

+

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"
+        }
+    ]
+}
+

Restart All Pods

+

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"
+    }
+]
+

Restart Pods by Type

+

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"
+    }
+]
+

Restart Pods by Type and Name

+

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"
+    }
+]
+

Scale Pods

+

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
+

Configuration

+

List Application Configuration

+

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"
+}
+

Create new Config

+

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"
+}
+

Unset Config Variable

+

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"
+}
+

Domains

+

List Application Domains

+

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"
+        }
+    ]
+}
+

Add Domain

+

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"
+}
+

Remove Domain

+

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
+

Builds

+

List Application Builds

+

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"
+        }
+    ]
+}
+

Create Application Build

+

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"
+}
+

Releases

+

List Application Releases

+

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
+        }
+    ]
+}
+

List Release Details

+

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
+}
+

Rollback Release

+

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}
+

Keys

+

List Keys

+

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"
+        }
+    ]
+}
+

Add Key to User

+

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"
+}
+

Remove Key from User

+

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
+

Permissions

+

List Application Permissions

+
+

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"
+    ]
+}
+

Create Application Permission

+

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
+

Remove Application Permission

+

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
+

List Administrators

+

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
+        }
+    ]
+}
+

Grant User Administrative Privileges

+
+

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
+

Remove User’s Administrative Privileges

+
+

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
+

Users

+

List all users

+
+

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": []
+        }
+    ]
+}
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/reference-guide/controller-api-v2-3/index.html b/docs/reference-guide/controller-api-v2-3/index.html new file mode 100644 index 000000000..abdf680da --- /dev/null +++ b/docs/reference-guide/controller-api-v2-3/index.html @@ -0,0 +1,1575 @@ + + + + + + + + + + + + + + + + + + + +Controller API v2.3 | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Controller API v2.3

+
This is the v2.3 REST API for the Controller.
+ +

What’s New

+

New! /v2/apps/{name}/logs endpoint was fixed and no longer returns b'log data' and instead returns a normal string log data

+

Authentication

+

Register a New User

+

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": []
+}
+

Log in

+

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"}
+

Cancel Account

+

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
+

Who Am I

+

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": []
+}
+

Regenerate Token

+
+

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"}
+

Change Password

+

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 the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+

Applications

+

List all Applications

+

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"
+        }
+    ]
+}
+

Create an Application

+

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"
+}
+

Destroy an Application

+

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
+

List Application Details

+

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"
+}
+

Update Application Details

+

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
+

Retrieve Application Logs

+

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"
+

Run one-off Commands

+
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"}
+

Certificates

+

List all Certificates

+

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"
+    }
+  ]
+}
+

Get Certificate Details

+

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"
+}
+

Create Certificate

+

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"
+}
+

Destroy a Certificate

+

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
+

Attach a Domain to a Certificate

+

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
+

Remove a Domain from a Certificate

+

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
+

Enable or disable TLS

+

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"
+}
+

Get TLS status

+

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"
+}
+

Pods

+

List all Pods

+

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"
+        }
+    ]
+}
+

List all Pods by Type

+

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"
+        }
+    ]
+}
+

Restart All Pods

+

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"
+    }
+]
+

Restart Pods by Type

+

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"
+    }
+]
+

Restart Pods by Type and Name

+

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"
+    }
+]
+

Scale Pods

+

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
+

Configuration

+

List Application Configuration

+

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"
+}
+

Create new Config

+

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"
+}
+

Unset Config Variable

+

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"
+}
+

Domains

+

List Application Domains

+

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"
+        }
+    ]
+}
+

Add Domain

+

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"
+}
+

Remove Domain

+

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
+

Builds

+

List Application Builds

+

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"
+        }
+    ]
+}
+

Create Application Build

+

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"
+}
+

Releases

+

List Application Releases

+

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
+        }
+    ]
+}
+

List Release Details

+

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
+}
+

Rollback Release

+

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}
+

Keys

+

List Keys

+

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"
+        }
+    ]
+}
+

Add Key to User

+

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"
+}
+

Remove Key from User

+

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
+

Permissions

+

List Application Permissions

+
+

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"
+    ]
+}
+

Create Application Permission

+

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
+

Remove Application Permission

+

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
+

List Administrators

+

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
+        }
+    ]
+}
+

Grant User Administrative Privileges

+
+

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
+

Remove User’s Administrative Privileges

+
+

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
+

Users

+

List all users

+
+

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": []
+        }
+    ]
+}
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/reference-guide/creating-a-self-signed-ssl-certificate/index.html b/docs/reference-guide/creating-a-self-signed-ssl-certificate/index.html new file mode 100644 index 000000000..aac88e0e8 --- /dev/null +++ b/docs/reference-guide/creating-a-self-signed-ssl-certificate/index.html @@ -0,0 +1,510 @@ + + + + + + + + + + + + + + + + + + + +Creating a Self-Signed SSL Certificate | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Creating a Self-Signed SSL Certificate

+
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.
+ +

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.

+

Prerequisites

+

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 XHomebrew: brew install openssl
Windowscomplete package .exe installed
Ubuntu Linuxapt-get install openssl
+

Generate Private Key and Certificate Signing Request

+

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 []:
+...
+
+

Generate SSL Certificate

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/reference-guide/index.html b/docs/reference-guide/index.html new file mode 100644 index 000000000..ff5285cd3 --- /dev/null +++ b/docs/reference-guide/index.html @@ -0,0 +1,484 @@ + + + + + + + + + + + + + + + + + + + + + +Reference Guide | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Reference Guide

+
Reference gxwuide definition and meaning.
+ + +
+ + +
+
+
+ Creating a Self-Signed SSL Certificate +
+

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.

+
+
+
+ Controller API v2.0 +
+

This is the v2.0 REST API for the Controller.

+
+
+
+ Controller API v2.1 +
+

This is the v2.1 REST API for the Controller.

+
+
+
+ Controller API v2.2 +
+

This is the v2.2 REST API for the Controller.

+
+
+
+ Controller API v2.3 +
+

This is the v2.3 REST API for the Controller.

+
+
+ +
+ + + + + + +
+ +
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/reference-guide/index.xml b/docs/reference-guide/index.xml new file mode 100644 index 000000000..aaa25b811 --- /dev/null +++ b/docs/reference-guide/index.xml @@ -0,0 +1,4054 @@ + + + Drycc – Reference Guide + /docs/reference-guide/ + Recent content in Reference Guide on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Docs: Creating a Self-Signed SSL Certificate + /docs/reference-guide/creating-a-self-signed-ssl-certificate/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/reference-guide/creating-a-self-signed-ssl-certificate/ + + + + <p>When <a href="/docs/applications/ssl-certificates/">using the app ssl</a> feature for non-production applications or when <a href="https://gateway-api.sigs.k8s.io/guides/tls/">installing SSL for the platform</a>, 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.</p> +<h2 id="prerequisites">Prerequisites<a class="td-heading-self-link" href="#prerequisites" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<pre><code>$ which openssl +/usr/bin/openssl +</code></pre> +<p>If the which command does not return a path then you will need to install openssl yourself:</p> +<table> +<thead> +<tr> +<th>If you have&hellip;</th> +<th>Install with&hellip;</th> +</tr> +</thead> +<tbody> +<tr> +<td>Mac OS X</td> +<td>Homebrew: <code>brew install openssl</code></td> +</tr> +<tr> +<td>Windows</td> +<td>complete package .exe installed</td> +</tr> +<tr> +<td>Ubuntu Linux</td> +<td><code>apt-get install openssl</code></td> +</tr> +</tbody> +</table> +<h2 id="generate-private-key-and-certificate-signing-request">Generate Private Key and Certificate Signing Request<a class="td-heading-self-link" href="#generate-private-key-and-certificate-signing-request" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<pre><code>$ 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 []: +... +</code></pre> +<h2 id="generate-ssl-certificate">Generate SSL Certificate<a class="td-heading-self-link" href="#generate-ssl-certificate" aria-label="Heading self-link"></a></h2> +<p>The self-signed SSL certificate is generated from the server.key private key and server.csr files.</p> +<pre><code>$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt +</code></pre> +<p>The server.crt file is your site certificate suitable for use with <a href="/docs/applications/ssl-certificates/">Drycc&rsquo;s SSL endpoint</a> along with the server.key private key.</p> + + + + + + Docs: Controller API v2.0 + /docs/reference-guide/controller-api-v2-0/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/reference-guide/controller-api-v2-0/ + + + + <h2 id="whats-new">What&rsquo;s New<a class="td-heading-self-link" href="#whats-new" aria-label="Heading self-link"></a></h2> +<p><strong>New!</strong> format of <code>POST /v2/apps/&lt;app id&gt;/run</code> has changed.</p> +<h2 id="authentication">Authentication<a class="td-heading-self-link" href="#authentication" aria-label="Heading self-link"></a></h2> +<h3 id="register-a-new-user">Register a New User<a class="td-heading-self-link" href="#register-a-new-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/register/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{ + &#34;username&#34;: &#34;test&#34;, + &#34;password&#34;: &#34;opensesame&#34;, + &#34;email&#34;: &#34;test@example.com&#34; +} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] +} +</code></pre><h3 id="log-in">Log in<a class="td-heading-self-link" href="#log-in" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/login/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{&#34;username&#34;: &#34;test&#34;, &#34;password&#34;: &#34;opensesame&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="cancel-account">Cancel Account<a class="td-heading-self-link" href="#cancel-account" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/auth/cancel/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="regenerate-token">Regenerate Token<a class="td-heading-self-link" href="#regenerate-token" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command could require administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/tokens/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;username&#34; : &#34;test&#34; + &#34;all&#34; : &#34;true&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="change-password">Change Password<a class="td-heading-self-link" href="#change-password" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/passwd/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;password&#34;: &#34;foo&#34;, + &#34;new_password&#34;: &#34;bar&#34; +} +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;username&#34;: &#34;testuser&#34;} +</code></pre><blockquote> +<p><strong>note</strong></p> +<p>Using the <code>username</code> parameter requires administrative privileges and makes the <code>password</code> parameter optional.</p> +</blockquote> +<p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="applications">Applications<a class="td-heading-self-link" href="#applications" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-applications">List all Applications<a class="td-heading-self-link" href="#list-all-applications" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;id&#34;: &#34;example-go&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="destroy-an-application">Destroy an Application<a class="td-heading-self-link" href="#destroy-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="list-application-details">List Application Details<a class="td-heading-self-link" href="#list-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="update-application-details">Update Application Details<a class="td-heading-self-link" href="#update-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{ + &#34;owner&#34;: &#34;test&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 1.8.0 +Content-Type: application/json +</code></pre><h3 id="retrieve-application-logs">Retrieve Application Logs<a class="td-heading-self-link" href="#retrieve-application-logs" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/logs/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional URL Query Parameters:</p> +<pre tabindex="0"><code>?log_lines= +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: text/plain + +&#34;16:51:14 drycc[api]: test created initial release\n&#34; +</code></pre><h3 id="run-one-off-commands">Run one-off Commands<a class="td-heading-self-link" href="#run-one-off-commands" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>POST /v2/apps/example-go/run/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;command&#34;: &#34;echo hi&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;exit_code&#34;: 0, &#34;output&#34;: &#34;hi\n&#34;} +</code></pre><h2 id="certificates">Certificates<a class="td-heading-self-link" href="#certificates" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-certificates">List all Certificates<a class="td-heading-self-link" href="#list-all-certificates" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; + } + ] +} +</code></pre><h3 id="get-certificate-details">Get Certificate Details<a class="td-heading-self-link" href="#get-certificate-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="create-certificate">Create Certificate<a class="td-heading-self-link" href="#create-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{ + &#34;name&#34;: &#34;foo&#34; + &#34;certificate&#34;: &#34;-----BEGIN CERTIFICATE-----&#34;, + &#34;key&#34;: &#34;-----BEGIN RSA PRIVATE KEY-----&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="destroy-a-certificate">Destroy a Certificate<a class="td-heading-self-link" href="#destroy-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="attach-a-domain-to-a-certificate">Attach a Domain to a Certificate<a class="td-heading-self-link" href="#attach-a-domain-to-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/foo/domain/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;domain&#34;: &#34;test.com&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="remove-a-domain-from-a-certificate">Remove a Domain from a Certificate<a class="td-heading-self-link" href="#remove-a-domain-from-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="pods">Pods<a class="td-heading-self-link" href="#pods" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-pods">List all Pods<a class="td-heading-self-link" href="#list-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="list-all-pods-by-type">List all Pods by Type<a class="td-heading-self-link" href="#list-all-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/web/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="restart-all-pods">Restart All Pods<a class="td-heading-self-link" href="#restart-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type">Restart Pods by Type<a class="td-heading-self-link" href="#restart-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type-and-name">Restart Pods by Type and Name<a class="td-heading-self-link" href="#restart-pods-by-type-and-name" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="scale-pods">Scale Pods<a class="td-heading-self-link" href="#scale-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/scale/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;web&#34;: 3} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="configuration">Configuration<a class="td-heading-self-link" href="#configuration" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-configuration">List Application Configuration<a class="td-heading-self-link" href="#list-application-configuration" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="create-new-config">Create new Config<a class="td-heading-self-link" href="#create-new-config" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: &#34;world&#34;, &#34;PLATFORM&#34;: &#34;drycc&#34;}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json +X-Drycc-Release: 3 + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v3&#34;, + &#34;HELLO&#34;: &#34;world&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="unset-config-variable">Unset Config Variable<a class="td-heading-self-link" href="#unset-config-variable" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: null}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json +X-Drycc-Release: 4 + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v4&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="domains">Domains<a class="td-heading-self-link" href="#domains" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-domains">List Application Domains<a class="td-heading-self-link" href="#list-application-domains" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; + } + ] +} +</code></pre><h3 id="add-domain">Add Domain<a class="td-heading-self-link" href="#add-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#39;domain&#39;: &#39;example.example.com&#39;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; +} +</code></pre><h3 id="remove-domain">Remove Domain<a class="td-heading-self-link" href="#remove-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="builds">Builds<a class="td-heading-self-link" href="#builds" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-builds">List Application Builds<a class="td-heading-self-link" href="#list-application-builds" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\&#34;/runner/init\&#34;] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db&#34;, + &#34;image&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: { + &#34;web&#34;: &#34;example-go&#34; + }, + &#34;sha&#34;: &#34;060da68f&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-application-build">Create Application Build<a class="td-heading-self-link" href="#create-application-build" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;image&#34;: &#34;drycc/example-go:latest&#34;} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;procfile&#34;: { + &#34;web&#34;: &#34;./cmd&#34; + } +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json +X-Drycc-Release: 4 + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;&#34;, + &#34;image&#34;: &#34;drycc/example-go:latest&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: {}, + &#34;sha&#34;: &#34;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-releases">List Application Releases<a class="td-heading-self-link" href="#list-application-releases" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 3, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;202d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;ed637ceb-5d32-44bd-9406-d326a777a513&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test changed nothing&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 3 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;202d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test deployed 060da68&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 2 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 + } + ] +} +</code></pre><h3 id="list-release-details">List Release Details<a class="td-heading-self-link" href="#list-release-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/v2/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 +} +</code></pre><h3 id="rollback-release">Rollback Release<a class="td-heading-self-link" href="#rollback-release" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;version&#34;: 1} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;version&#34;: 5} +</code></pre><h2 id="keys">Keys<a class="td-heading-self-link" href="#keys" aria-label="Heading self-link"></a></h2> +<h3 id="list-keys">List Keys<a class="td-heading-self-link" href="#list-keys" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;test@example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="add-key-to-user">Add Key to User<a class="td-heading-self-link" href="#add-key-to-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;id&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example&#34;, + &#34;owner&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="remove-key-from-user">Remove Key from User<a class="td-heading-self-link" href="#remove-key-from-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/keys/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="permissions">Permissions<a class="td-heading-self-link" href="#permissions" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-permissions">List Application Permissions<a class="td-heading-self-link" href="#list-application-permissions" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This does not include the app owner.</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;users&#34;: [ + &#34;test&#34;, + &#34;foo&#34; + ] +} +</code></pre><h3 id="create-application-permission">Create Application Permission<a class="td-heading-self-link" href="#create-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="remove-application-permission">Remove Application Permission<a class="td-heading-self-link" href="#remove-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="list-administrators">List Administrators<a class="td-heading-self-link" href="#list-administrators" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/admin/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 2, + &#34;next&#34;: null + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;username&#34;: &#34;test&#34;, + &#34;is_superuser&#34;: true + }, + { + &#34;username&#34;: &#34;foo&#34;, + &#34;is_superuser&#34;: true + } + ] +} +</code></pre><h3 id="grant-user-administrative-privileges">Grant User Administrative Privileges<a class="td-heading-self-link" href="#grant-user-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/admin/perms HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="remove-users-administrative-privileges">Remove User&rsquo;s Administrative Privileges<a class="td-heading-self-link" href="#remove-users-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/admin/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="users">Users<a class="td-heading-self-link" href="#users" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-users">List all users<a class="td-heading-self-link" href="#list-all-users" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/users HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.0 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] + } + ] +} +</code></pre> + + + + + Docs: Controller API v2.1 + /docs/reference-guide/controller-api-v2-1/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/reference-guide/controller-api-v2-1/ + + + + <h2 id="whats-new">What&rsquo;s New<a class="td-heading-self-link" href="#whats-new" aria-label="Heading self-link"></a></h2> +<p><strong>New!</strong> <code>healthcheck</code> field in configuration, deprecates the <code>HEALTHCHECK_*</code> environment variables.</p> +<p><strong>New!</strong> Unsetting a configuration variable that does not exist will return a 422.</p> +<p><strong>New!</strong> Creating an identical sequential release returns a 409 rather than create a no-op release.</p> +<h2 id="authentication">Authentication<a class="td-heading-self-link" href="#authentication" aria-label="Heading self-link"></a></h2> +<h3 id="register-a-new-user">Register a New User<a class="td-heading-self-link" href="#register-a-new-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/register/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{ + &#34;username&#34;: &#34;test&#34;, + &#34;password&#34;: &#34;opensesame&#34;, + &#34;email&#34;: &#34;test@example.com&#34; +} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] +} +</code></pre><h3 id="log-in">Log in<a class="td-heading-self-link" href="#log-in" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/login/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{&#34;username&#34;: &#34;test&#34;, &#34;password&#34;: &#34;opensesame&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="cancel-account">Cancel Account<a class="td-heading-self-link" href="#cancel-account" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/auth/cancel/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="regenerate-token">Regenerate Token<a class="td-heading-self-link" href="#regenerate-token" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command could require administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/tokens/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;username&#34; : &#34;test&#34; + &#34;all&#34; : &#34;true&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="change-password">Change Password<a class="td-heading-self-link" href="#change-password" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/passwd/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;password&#34;: &#34;foo&#34;, + &#34;new_password&#34;: &#34;bar&#34; +} +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;username&#34;: &#34;testuser&#34;} +</code></pre><blockquote> +<p><strong>note</strong></p> +<p>Using the <code>username</code> parameter requires administrative privileges and makes the <code>password</code> parameter optional.</p> +</blockquote> +<p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="applications">Applications<a class="td-heading-self-link" href="#applications" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-applications">List all Applications<a class="td-heading-self-link" href="#list-all-applications" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;id&#34;: &#34;example-go&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="destroy-an-application">Destroy an Application<a class="td-heading-self-link" href="#destroy-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="list-application-details">List Application Details<a class="td-heading-self-link" href="#list-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="update-application-details">Update Application Details<a class="td-heading-self-link" href="#update-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{ + &#34;owner&#34;: &#34;test&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 1.8.0 +Content-Type: application/json +</code></pre><h3 id="retrieve-application-logs">Retrieve Application Logs<a class="td-heading-self-link" href="#retrieve-application-logs" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/logs/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional URL Query Parameters:</p> +<pre tabindex="0"><code>?log_lines= +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: text/plain + +&#34;16:51:14 drycc[api]: test created initial release\n&#34; +</code></pre><h3 id="run-one-off-commands">Run one-off Commands<a class="td-heading-self-link" href="#run-one-off-commands" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>POST /v2/apps/example-go/run/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;command&#34;: &#34;echo hi&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;exit_code&#34;: 0, &#34;output&#34;: &#34;hi\n&#34;} +</code></pre><h2 id="certificates">Certificates<a class="td-heading-self-link" href="#certificates" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-certificates">List all Certificates<a class="td-heading-self-link" href="#list-all-certificates" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; + } + ] +} +</code></pre><h3 id="get-certificate-details">Get Certificate Details<a class="td-heading-self-link" href="#get-certificate-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="create-certificate">Create Certificate<a class="td-heading-self-link" href="#create-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{ + &#34;name&#34;: &#34;foo&#34; + &#34;certificate&#34;: &#34;-----BEGIN CERTIFICATE-----&#34;, + &#34;key&#34;: &#34;-----BEGIN RSA PRIVATE KEY-----&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="destroy-a-certificate">Destroy a Certificate<a class="td-heading-self-link" href="#destroy-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="attach-a-domain-to-a-certificate">Attach a Domain to a Certificate<a class="td-heading-self-link" href="#attach-a-domain-to-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/foo/domain/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;domain&#34;: &#34;test.com&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="remove-a-domain-from-a-certificate">Remove a Domain from a Certificate<a class="td-heading-self-link" href="#remove-a-domain-from-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="pods">Pods<a class="td-heading-self-link" href="#pods" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-pods">List all Pods<a class="td-heading-self-link" href="#list-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="list-all-pods-by-type">List all Pods by Type<a class="td-heading-self-link" href="#list-all-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/web/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="restart-all-pods">Restart All Pods<a class="td-heading-self-link" href="#restart-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type">Restart Pods by Type<a class="td-heading-self-link" href="#restart-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type-and-name">Restart Pods by Type and Name<a class="td-heading-self-link" href="#restart-pods-by-type-and-name" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="scale-pods">Scale Pods<a class="td-heading-self-link" href="#scale-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/scale/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;web&#34;: 3} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="configuration">Configuration<a class="td-heading-self-link" href="#configuration" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-configuration">List Application Configuration<a class="td-heading-self-link" href="#list-application-configuration" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="create-new-config">Create new Config<a class="td-heading-self-link" href="#create-new-config" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: &#34;world&#34;, &#34;PLATFORM&#34;: &#34;drycc&#34;}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v3&#34;, + &#34;HELLO&#34;: &#34;world&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="unset-config-variable">Unset Config Variable<a class="td-heading-self-link" href="#unset-config-variable" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: null}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v4&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="domains">Domains<a class="td-heading-self-link" href="#domains" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-domains">List Application Domains<a class="td-heading-self-link" href="#list-application-domains" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; + } + ] +} +</code></pre><h3 id="add-domain">Add Domain<a class="td-heading-self-link" href="#add-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#39;domain&#39;: &#39;example.example.com&#39;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; +} +</code></pre><h3 id="remove-domain">Remove Domain<a class="td-heading-self-link" href="#remove-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="builds">Builds<a class="td-heading-self-link" href="#builds" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-builds">List Application Builds<a class="td-heading-self-link" href="#list-application-builds" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\&#34;/runner/init\&#34;] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db&#34;, + &#34;image&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: { + &#34;web&#34;: &#34;example-go&#34; + }, + &#34;sha&#34;: &#34;060da68f&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-application-build">Create Application Build<a class="td-heading-self-link" href="#create-application-build" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;image&#34;: &#34;drycc/example-go:latest&#34;} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;procfile&#34;: { + &#34;web&#34;: &#34;./cmd&#34; + } +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;&#34;, + &#34;image&#34;: &#34;drycc/example-go:latest&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: {}, + &#34;sha&#34;: &#34;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-releases">List Application Releases<a class="td-heading-self-link" href="#list-application-releases" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 3, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;202d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;ed637ceb-5d32-44bd-9406-d326a777a513&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test changed nothing&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 3 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;202d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test deployed 060da68&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 2 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 + } + ] +} +</code></pre><h3 id="list-release-details">List Release Details<a class="td-heading-self-link" href="#list-release-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/v2/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 +} +</code></pre><h3 id="rollback-release">Rollback Release<a class="td-heading-self-link" href="#rollback-release" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;version&#34;: 1} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{&#34;version&#34;: 5} +</code></pre><h2 id="keys">Keys<a class="td-heading-self-link" href="#keys" aria-label="Heading self-link"></a></h2> +<h3 id="list-keys">List Keys<a class="td-heading-self-link" href="#list-keys" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;test@example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="add-key-to-user">Add Key to User<a class="td-heading-self-link" href="#add-key-to-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;id&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example&#34;, + &#34;owner&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="remove-key-from-user">Remove Key from User<a class="td-heading-self-link" href="#remove-key-from-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/keys/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="permissions">Permissions<a class="td-heading-self-link" href="#permissions" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-permissions">List Application Permissions<a class="td-heading-self-link" href="#list-application-permissions" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This does not include the app owner.</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;users&#34;: [ + &#34;test&#34;, + &#34;foo&#34; + ] +} +</code></pre><h3 id="create-application-permission">Create Application Permission<a class="td-heading-self-link" href="#create-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="remove-application-permission">Remove Application Permission<a class="td-heading-self-link" href="#remove-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="list-administrators">List Administrators<a class="td-heading-self-link" href="#list-administrators" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/admin/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 2, + &#34;next&#34;: null + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;username&#34;: &#34;test&#34;, + &#34;is_superuser&#34;: true + }, + { + &#34;username&#34;: &#34;foo&#34;, + &#34;is_superuser&#34;: true + } + ] +} +</code></pre><h3 id="grant-user-administrative-privileges">Grant User Administrative Privileges<a class="td-heading-self-link" href="#grant-user-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/admin/perms HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h3 id="remove-users-administrative-privileges">Remove User&rsquo;s Administrative Privileges<a class="td-heading-self-link" href="#remove-users-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/admin/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +</code></pre><h2 id="users">Users<a class="td-heading-self-link" href="#users" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-users">List all users<a class="td-heading-self-link" href="#list-all-users" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/users HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.1 +DRYCC_PLATFORM_VERSION: 2.1.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] + } + ] +} +</code></pre> + + + + + Docs: Controller API v2.2 + /docs/reference-guide/controller-api-v2-2/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/reference-guide/controller-api-v2-2/ + + + + <h2 id="whats-new">What&rsquo;s New<a class="td-heading-self-link" href="#whats-new" aria-label="Heading self-link"></a></h2> +<p><strong>New!</strong> <code>/v2/auth/whoami</code> endpoint</p> +<h2 id="authentication">Authentication<a class="td-heading-self-link" href="#authentication" aria-label="Heading self-link"></a></h2> +<h3 id="register-a-new-user">Register a New User<a class="td-heading-self-link" href="#register-a-new-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/register/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{ + &#34;username&#34;: &#34;test&#34;, + &#34;password&#34;: &#34;opensesame&#34;, + &#34;email&#34;: &#34;test@example.com&#34; +} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] +} +</code></pre><h3 id="log-in">Log in<a class="td-heading-self-link" href="#log-in" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/login/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{&#34;username&#34;: &#34;test&#34;, &#34;password&#34;: &#34;opensesame&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="cancel-account">Cancel Account<a class="td-heading-self-link" href="#cancel-account" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/auth/cancel/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="who-am-i">Who Am I<a class="td-heading-self-link" href="#who-am-i" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/auth/whoami/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] +} +</code></pre><h3 id="regenerate-token">Regenerate Token<a class="td-heading-self-link" href="#regenerate-token" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command could require administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/tokens/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;username&#34; : &#34;test&#34; + &#34;all&#34; : &#34;true&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="change-password">Change Password<a class="td-heading-self-link" href="#change-password" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/passwd/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;password&#34;: &#34;foo&#34;, + &#34;new_password&#34;: &#34;bar&#34; +} +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;username&#34;: &#34;testuser&#34;} +</code></pre><blockquote> +<p><strong>note</strong></p> +<p>Using the <code>username</code> parameter requires administrative privileges and makes the <code>password</code> parameter optional.</p> +</blockquote> +<p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h2 id="applications">Applications<a class="td-heading-self-link" href="#applications" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-applications">List all Applications<a class="td-heading-self-link" href="#list-all-applications" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;id&#34;: &#34;example-go&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="destroy-an-application">Destroy an Application<a class="td-heading-self-link" href="#destroy-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="list-application-details">List Application Details<a class="td-heading-self-link" href="#list-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="update-application-details">Update Application Details<a class="td-heading-self-link" href="#update-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{ + &#34;owner&#34;: &#34;test&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 1.8.0 +Content-Type: application/json +</code></pre><h3 id="retrieve-application-logs">Retrieve Application Logs<a class="td-heading-self-link" href="#retrieve-application-logs" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/logs/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional URL Query Parameters:</p> +<pre tabindex="0"><code>?log_lines= +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: text/plain + +&#34;16:51:14 drycc[api]: test created initial release\n&#34; +</code></pre><h3 id="run-one-off-commands">Run one-off Commands<a class="td-heading-self-link" href="#run-one-off-commands" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>POST /v2/apps/example-go/run/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;command&#34;: &#34;echo hi&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{&#34;exit_code&#34;: 0, &#34;output&#34;: &#34;hi\n&#34;} +</code></pre><h2 id="certificates">Certificates<a class="td-heading-self-link" href="#certificates" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-certificates">List all Certificates<a class="td-heading-self-link" href="#list-all-certificates" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; + } + ] +} +</code></pre><h3 id="get-certificate-details">Get Certificate Details<a class="td-heading-self-link" href="#get-certificate-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="create-certificate">Create Certificate<a class="td-heading-self-link" href="#create-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{ + &#34;name&#34;: &#34;foo&#34; + &#34;certificate&#34;: &#34;-----BEGIN CERTIFICATE-----&#34;, + &#34;key&#34;: &#34;-----BEGIN RSA PRIVATE KEY-----&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22T22:24:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="destroy-a-certificate">Destroy a Certificate<a class="td-heading-self-link" href="#destroy-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="attach-a-domain-to-a-certificate">Attach a Domain to a Certificate<a class="td-heading-self-link" href="#attach-a-domain-to-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/foo/domain/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;domain&#34;: &#34;test.com&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="remove-a-domain-from-a-certificate">Remove a Domain from a Certificate<a class="td-heading-self-link" href="#remove-a-domain-from-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h2 id="pods">Pods<a class="td-heading-self-link" href="#pods" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-pods">List all Pods<a class="td-heading-self-link" href="#list-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="list-all-pods-by-type">List all Pods by Type<a class="td-heading-self-link" href="#list-all-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/web/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="restart-all-pods">Restart All Pods<a class="td-heading-self-link" href="#restart-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type">Restart Pods by Type<a class="td-heading-self-link" href="#restart-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type-and-name">Restart Pods by Type and Name<a class="td-heading-self-link" href="#restart-pods-by-type-and-name" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="scale-pods">Scale Pods<a class="td-heading-self-link" href="#scale-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/scale/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;web&#34;: 3} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h2 id="configuration">Configuration<a class="td-heading-self-link" href="#configuration" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-configuration">List Application Configuration<a class="td-heading-self-link" href="#list-application-configuration" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="create-new-config">Create new Config<a class="td-heading-self-link" href="#create-new-config" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: &#34;world&#34;, &#34;PLATFORM&#34;: &#34;drycc&#34;}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v3&#34;, + &#34;HELLO&#34;: &#34;world&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="unset-config-variable">Unset Config Variable<a class="td-heading-self-link" href="#unset-config-variable" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: null}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v4&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="domains">Domains<a class="td-heading-self-link" href="#domains" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-domains">List Application Domains<a class="td-heading-self-link" href="#list-application-domains" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; + } + ] +} +</code></pre><h3 id="add-domain">Add Domain<a class="td-heading-self-link" href="#add-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#39;domain&#39;: &#39;example.example.com&#39;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; +} +</code></pre><h3 id="remove-domain">Remove Domain<a class="td-heading-self-link" href="#remove-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h2 id="builds">Builds<a class="td-heading-self-link" href="#builds" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-builds">List Application Builds<a class="td-heading-self-link" href="#list-application-builds" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\&#34;/runner/init\&#34;] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db&#34;, + &#34;image&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: { + &#34;web&#34;: &#34;example-go&#34; + }, + &#34;sha&#34;: &#34;060da68f&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-application-build">Create Application Build<a class="td-heading-self-link" href="#create-application-build" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;image&#34;: &#34;drycc/example-go:latest&#34;} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;procfile&#34;: { + &#34;web&#34;: &#34;./cmd&#34; + } +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;&#34;, + &#34;image&#34;: &#34;drycc/example-go:latest&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: {}, + &#34;sha&#34;: &#34;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-releases">List Application Releases<a class="td-heading-self-link" href="#list-application-releases" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 3, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;202d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;ed637ceb-5d32-44bd-9406-d326a777a513&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test changed nothing&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 3 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;202d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test deployed 060da68&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 2 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 + } + ] +} +</code></pre><h3 id="list-release-details">List Release Details<a class="td-heading-self-link" href="#list-release-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/v2/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 +} +</code></pre><h3 id="rollback-release">Rollback Release<a class="td-heading-self-link" href="#rollback-release" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;version&#34;: 1} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{&#34;version&#34;: 5} +</code></pre><h2 id="keys">Keys<a class="td-heading-self-link" href="#keys" aria-label="Heading self-link"></a></h2> +<h3 id="list-keys">List Keys<a class="td-heading-self-link" href="#list-keys" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;test@example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="add-key-to-user">Add Key to User<a class="td-heading-self-link" href="#add-key-to-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;id&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example&#34;, + &#34;owner&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="remove-key-from-user">Remove Key from User<a class="td-heading-self-link" href="#remove-key-from-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/keys/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h2 id="permissions">Permissions<a class="td-heading-self-link" href="#permissions" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-permissions">List Application Permissions<a class="td-heading-self-link" href="#list-application-permissions" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This does not include the app owner.</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;users&#34;: [ + &#34;test&#34;, + &#34;foo&#34; + ] +} +</code></pre><h3 id="create-application-permission">Create Application Permission<a class="td-heading-self-link" href="#create-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="remove-application-permission">Remove Application Permission<a class="td-heading-self-link" href="#remove-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="list-administrators">List Administrators<a class="td-heading-self-link" href="#list-administrators" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/admin/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 2, + &#34;next&#34;: null + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;username&#34;: &#34;test&#34;, + &#34;is_superuser&#34;: true + }, + { + &#34;username&#34;: &#34;foo&#34;, + &#34;is_superuser&#34;: true + } + ] +} +</code></pre><h3 id="grant-user-administrative-privileges">Grant User Administrative Privileges<a class="td-heading-self-link" href="#grant-user-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/admin/perms HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h3 id="remove-users-administrative-privileges">Remove User&rsquo;s Administrative Privileges<a class="td-heading-self-link" href="#remove-users-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/admin/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +</code></pre><h2 id="users">Users<a class="td-heading-self-link" href="#users" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-users">List all users<a class="td-heading-self-link" href="#list-all-users" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/users HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.2 +DRYCC_PLATFORM_VERSION: 2.2.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] + } + ] +} +</code></pre> + + + + + Docs: Controller API v2.3 + /docs/reference-guide/controller-api-v2-3/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/reference-guide/controller-api-v2-3/ + + + + <h2 id="whats-new">What&rsquo;s New<a class="td-heading-self-link" href="#whats-new" aria-label="Heading self-link"></a></h2> +<p><strong>New!</strong> <code>/v2/apps/{name}/logs</code> endpoint was fixed and no longer returns <code>b'log data'</code> and instead returns a normal string <code>log data</code></p> +<h2 id="authentication">Authentication<a class="td-heading-self-link" href="#authentication" aria-label="Heading self-link"></a></h2> +<h3 id="register-a-new-user">Register a New User<a class="td-heading-self-link" href="#register-a-new-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/register/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{ + &#34;username&#34;: &#34;test&#34;, + &#34;password&#34;: &#34;opensesame&#34;, + &#34;email&#34;: &#34;test@example.com&#34; +} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] +} +</code></pre><h3 id="log-in">Log in<a class="td-heading-self-link" href="#log-in" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/login/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json + +{&#34;username&#34;: &#34;test&#34;, &#34;password&#34;: &#34;opensesame&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="cancel-account">Cancel Account<a class="td-heading-self-link" href="#cancel-account" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/auth/cancel/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="who-am-i">Who Am I<a class="td-heading-self-link" href="#who-am-i" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/auth/whoami/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] +} +</code></pre><h3 id="regenerate-token">Regenerate Token<a class="td-heading-self-link" href="#regenerate-token" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command could require administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/tokens/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;username&#34; : &#34;test&#34; + &#34;all&#34; : &#34;true&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{&#34;token&#34;: &#34;abc123&#34;} +</code></pre><h3 id="change-password">Change Password<a class="td-heading-self-link" href="#change-password" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/auth/passwd/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;password&#34;: &#34;foo&#34;, + &#34;new_password&#34;: &#34;bar&#34; +} +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;username&#34;: &#34;testuser&#34;} +</code></pre><blockquote> +<p><strong>note</strong></p> +<p>Using the <code>username</code> parameter requires administrative privileges and makes the <code>password</code> parameter optional.</p> +</blockquote> +<p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h2 id="applications">Applications<a class="td-heading-self-link" href="#applications" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-applications">List all Applications<a class="td-heading-self-link" href="#list-all-applications" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-an-application">Create an Application<a class="td-heading-self-link" href="#create-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{&#34;id&#34;: &#34;example-go&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="destroy-an-application">Destroy an Application<a class="td-heading-self-link" href="#destroy-an-application" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="list-application-details">List Application Details<a class="td-heading-self-link" href="#list-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;structure&#34;: {}, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;url&#34;: &#34;example-go.example.com&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="update-application-details">Update Application Details<a class="td-heading-self-link" href="#update-application-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional parameters:</p> +<pre tabindex="0"><code>{ + &#34;owner&#34;: &#34;test&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 1.8.0 +Content-Type: application/json +</code></pre><h3 id="retrieve-application-logs">Retrieve Application Logs<a class="td-heading-self-link" href="#retrieve-application-logs" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/logs/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Optional URL Query Parameters:</p> +<pre tabindex="0"><code>?log_lines= +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: text/plain + +&#34;16:51:14 drycc[api]: test created initial release\n&#34; +</code></pre><h3 id="run-one-off-commands">Run one-off Commands<a class="td-heading-self-link" href="#run-one-off-commands" aria-label="Heading self-link"></a></h3> +<pre tabindex="0"><code>POST /v2/apps/example-go/run/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;command&#34;: &#34;echo hi&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{&#34;exit_code&#34;: 0, &#34;output&#34;: &#34;hi\n&#34;} +</code></pre><h2 id="certificates">Certificates<a class="td-heading-self-link" href="#certificates" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-certificates">List all Certificates<a class="td-heading-self-link" href="#list-all-certificates" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22.32.34:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22.32.34:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; + } + ] +} +</code></pre><h3 id="get-certificate-details">Get Certificate Details<a class="td-heading-self-link" href="#get-certificate-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22.32.34:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22.32.34:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="create-certificate">Create Certificate<a class="td-heading-self-link" href="#create-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{ + &#34;name&#34;: &#34;foo&#34; + &#34;certificate&#34;: &#34;-----BEGIN CERTIFICATE-----&#34;, + &#34;key&#34;: &#34;-----BEGIN RSA PRIVATE KEY-----&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;id&#34;: 22, + &#34;owner&#34;: &#34;test&#34;, + &#34;san&#34;: [], + &#34;domains&#34;: [], + &#34;created&#34;: &#34;2016-06-22.32.34:20Z&#34;, + &#34;updated&#34;: &#34;2016-06-22.32.34:20Z&#34;, + &#34;name&#34;: &#34;foo&#34;, + &#34;common_name&#34;: &#34;bar.com&#34;, + &#34;fingerprint&#34;: &#34;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&#34;, + &#34;expires&#34;: &#34;2017-01-14T23:57:57Z&#34;, + &#34;starts&#34;: &#34;2016-01-15T23:57:57Z&#34;, + &#34;issuer&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34;, + &#34;subject&#34;: &#34;/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc&#34; +} +</code></pre><h3 id="destroy-a-certificate">Destroy a Certificate<a class="td-heading-self-link" href="#destroy-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="attach-a-domain-to-a-certificate">Attach a Domain to a Certificate<a class="td-heading-self-link" href="#attach-a-domain-to-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/certs/foo/domain/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;domain&#34;: &#34;test.com&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="remove-a-domain-from-a-certificate">Remove a Domain from a Certificate<a class="td-heading-self-link" href="#remove-a-domain-from-a-certificate" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="enable-or-disable-tls">Enable or disable TLS<a class="td-heading-self-link" href="#enable-or-disable-tls" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/tls/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{ + &#34;https_enforced&#34;: true +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;https_enforced&#34;: true, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="get-tls-status">Get TLS status<a class="td-heading-self-link" href="#get-tls-status" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/tls/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;https_enforced&#34;: false, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="pods">Pods<a class="td-heading-self-link" href="#pods" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-pods">List all Pods<a class="td-heading-self-link" href="#list-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="list-all-pods-by-type">List all Pods by Type<a class="td-heading-self-link" href="#list-all-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/pods/web/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;results&#34;: [ + { + &#34;name&#34;: &#34;go-v2-web-e7dej&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2014-01-01T00:00:00Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } + ] +} +</code></pre><h3 id="restart-all-pods">Restart All Pods<a class="td-heading-self-link" href="#restart-all-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type">Restart Pods by Type<a class="td-heading-self-link" href="#restart-pods-by-type" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="restart-pods-by-type-and-name">Restart Pods by Type and Name<a class="td-heading-self-link" href="#restart-pods-by-type-and-name" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +[ + { + &#34;name&#34;: &#34;go-v2-web-atots&#34;, + &#34;release&#34;: &#34;v2&#34;, + &#34;started&#34;: &#34;2016-04-11T21:07:54Z&#34;, + &#34;state&#34;: &#34;up&#34;, + &#34;type&#34;: &#34;web&#34; + } +] +</code></pre><h3 id="scale-pods">Scale Pods<a class="td-heading-self-link" href="#scale-pods" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/scale/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;web&#34;: 3} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h2 id="configuration">Configuration<a class="td-heading-self-link" href="#configuration" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-configuration">List Application Configuration<a class="td-heading-self-link" href="#list-application-configuration" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="create-new-config">Create new Config<a class="td-heading-self-link" href="#create-new-config" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: &#34;world&#34;, &#34;PLATFORM&#34;: &#34;drycc&#34;}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v3&#34;, + &#34;HELLO&#34;: &#34;world&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="unset-config-variable">Unset Config Variable<a class="td-heading-self-link" href="#unset-config-variable" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/config/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;values&#34;: {&#34;HELLO&#34;: null}} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;owner&#34;: &#34;test&#34;, + &#34;app&#34;: &#34;example-go&#34;, + &#34;values&#34;: { + &#34;DRYCC_APP&#34;: &#34;example-go&#34;, + &#34;DRYCC_RELEASE&#34;: &#34;v4&#34;, + &#34;PLATFORM&#34;: &#34;drycc&#34; + }, + &#34;memory&#34;: {}, + &#34;cpu&#34;: {}, + &#34;tags&#34;: {}, + &#34;healthcheck&#34;: {}, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="domains">Domains<a class="td-heading-self-link" href="#domains" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-domains">List Application Domains<a class="td-heading-self-link" href="#list-application-domains" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; + } + ] +} +</code></pre><h3 id="add-domain">Add Domain<a class="td-heading-self-link" href="#add-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/domains/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#39;domain&#39;: &#39;example.example.com&#39;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;domain&#34;: &#34;example.example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34; +} +</code></pre><h3 id="remove-domain">Remove Domain<a class="td-heading-self-link" href="#remove-domain" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h2 id="builds">Builds<a class="td-heading-self-link" href="#builds" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-builds">List Application Builds<a class="td-heading-self-link" href="#list-application-builds" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\&#34;/runner/init\&#34;] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db&#34;, + &#34;image&#34;: &#34;example-go&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: { + &#34;web&#34;: &#34;example-go&#34; + }, + &#34;sha&#34;: &#34;060da68f&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="create-application-build">Create Application Build<a class="td-heading-self-link" href="#create-application-build" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/builds/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;image&#34;: &#34;drycc/example-go:latest&#34;} +</code></pre><p>Optional Parameters:</p> +<pre tabindex="0"><code>{ + &#34;procfile&#34;: { + &#34;web&#34;: &#34;./cmd&#34; + } +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;dockerfile&#34;: &#34;&#34;, + &#34;image&#34;: &#34;drycc/example-go:latest&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;procfile&#34;: {}, + &#34;sha&#34;: &#34;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h2 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-releases">List Application Releases<a class="td-heading-self-link" href="#list-application-releases" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 3, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;2.3d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;ed637ceb-5d32-44bd-9406-d326a777a513&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test changed nothing&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 3 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: &#34;2.3d8e4b-600e-4425-a85c-ffc7ea607f61&#34;, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test deployed 060da68&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 2 + }, + { + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 + } + ] +} +</code></pre><h3 id="list-release-details">List Release Details<a class="td-heading-self-link" href="#list-release-details" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/releases/v2/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;app&#34;: &#34;example-go&#34;, + &#34;build&#34;: null, + &#34;config&#34;: &#34;95bd6dea-1685-4f78-a03d-fd7270b058d1&#34;, + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;summary&#34;: &#34;test created initial release&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34;, + &#34;version&#34;: 1 +} +</code></pre><h3 id="rollback-release">Rollback Release<a class="td-heading-self-link" href="#rollback-release" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 +Host: drycc.example.com +Content-Type: application/json +Authorization: token abc123 + +{&#34;version&#34;: 1} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{&#34;version&#34;: 5} +</code></pre><h2 id="keys">Keys<a class="td-heading-self-link" href="#keys" aria-label="Heading self-link"></a></h2> +<h3 id="list-keys">List Keys<a class="td-heading-self-link" href="#list-keys" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;test@example.com&#34;, + &#34;owner&#34;: &#34;test&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; + } + ] +} +</code></pre><h3 id="add-key-to-user">Add Key to User<a class="td-heading-self-link" href="#add-key-to-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/keys/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{ + &#34;id&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34; +} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;created&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;id&#34;: &#34;example&#34;, + &#34;owner&#34;: &#34;example&#34;, + &#34;public&#34;: &#34;ssh-rsa &lt;...&gt;&#34;, + &#34;updated&#34;: &#34;2014-01-01T00:00:00UTC&#34;, + &#34;uuid&#34;: &#34;de1bf5b5-4a72-4f94-a10c-d2a3741cdf75&#34; +} +</code></pre><h3 id="remove-key-from-user">Remove Key from User<a class="td-heading-self-link" href="#remove-key-from-user" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/keys/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h2 id="permissions">Permissions<a class="td-heading-self-link" href="#permissions" aria-label="Heading self-link"></a></h2> +<h3 id="list-application-permissions">List Application Permissions<a class="td-heading-self-link" href="#list-application-permissions" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This does not include the app owner.</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;users&#34;: [ + &#34;test&#34;, + &#34;foo&#34; + ] +} +</code></pre><h3 id="create-application-permission">Create Application Permission<a class="td-heading-self-link" href="#create-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/apps/example-go/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="remove-application-permission">Remove Application Permission<a class="td-heading-self-link" href="#remove-application-permission" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/apps/example-go/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="list-administrators">List Administrators<a class="td-heading-self-link" href="#list-administrators" aria-label="Heading self-link"></a></h3> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/admin/perms/ HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 2, + &#34;next&#34;: null + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;username&#34;: &#34;test&#34;, + &#34;is_superuser&#34;: true + }, + { + &#34;username&#34;: &#34;foo&#34;, + &#34;is_superuser&#34;: true + } + ] +} +</code></pre><h3 id="grant-user-administrative-privileges">Grant User Administrative Privileges<a class="td-heading-self-link" href="#grant-user-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>POST /v2/admin/perms HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 + +{&#34;username&#34;: &#34;example&#34;} +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 201 CREATED +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h3 id="remove-users-administrative-privileges">Remove User&rsquo;s Administrative Privileges<a class="td-heading-self-link" href="#remove-users-administrative-privileges" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>DELETE /v2/admin/perms/example HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 204 NO CONTENT +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +</code></pre><h2 id="users">Users<a class="td-heading-self-link" href="#users" aria-label="Heading self-link"></a></h2> +<h3 id="list-all-users">List all users<a class="td-heading-self-link" href="#list-all-users" aria-label="Heading self-link"></a></h3> +<blockquote> +<p><strong>note</strong></p> +<p>This command requires administrative privileges</p> +</blockquote> +<p>Example Request:</p> +<pre tabindex="0"><code>GET /v2/users HTTP/1.1 +Host: drycc.example.com +Authorization: token abc123 +</code></pre><p>Example Response:</p> +<pre tabindex="0"><code>HTTP/1.1 200 OK +DRYCC_API_VERSION: 2.3 +DRYCC_PLATFORM_VERSION: 2.3.0 +Content-Type: application/json + +{ + &#34;count&#34;: 1, + &#34;next&#34;: null, + &#34;previous&#34;: null, + &#34;results&#34;: [ + { + &#34;id&#34;: 1, + &#34;last_login&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;is_superuser&#34;: true, + &#34;username&#34;: &#34;test&#34;, + &#34;first_name&#34;: &#34;test&#34;, + &#34;last_name&#34;: &#34;testerson&#34;, + &#34;email&#34;: &#34;test@example.com&#34;, + &#34;is_staff&#34;: true, + &#34;is_active&#34;: true, + &#34;date_joined&#34;: &#34;2014-10-19T22:01:00.601Z&#34;, + &#34;groups&#34;: [], + &#34;user_permissions&#34;: [] + } + ] +} +</code></pre> + + + + + diff --git a/docs/roadmap/_print/index.html b/docs/roadmap/_print/index.html new file mode 100644 index 000000000..a5cafb3d8 --- /dev/null +++ b/docs/roadmap/_print/index.html @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + + + + +Roadmap | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Roadmap

+
Browse the ever-growing list of up-to-date, community driven roadmaps.
+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + +
+ +

1 - Planning Process

+
Drycc features a lightweight process that emphasizes openness and ensures every community member can be an integral part of planning for the future.
+

The Role of Maintainers

+

Maintainers lead the Drycc projects. Their duties include proposing the Roadmap, reviewing and integrating contributions and maintaining the vision of the project.

+

Open Roadmap

+

The Drycc Roadmap is a community document. While Maintainers propose the Roadmap, it gets discussed and refined in Release Planning Meetings.

+

Contributing to the Roadmap

+

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.

+

Release Milestones

+

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.

+

Release Planning Meetings

+

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.

+

Credits

+

Thanks to Amy Lindburg and our friends at Podman for their inspiration.

+ +
+ + + + + + + + + + + +
+ +

2 - Drycc Workflow Roadmap

+
Drycc roadmap is community driven and managed through GitHub.
+

Drycc Workflow Roadmap

+

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.

+

Interactive drycc run /bin/bash

+

Provide the ability for developers to launch an interactive terminal session in +their application environment.

+

Related issues:

+ +

Log Streaming

+

Stream application logs via drycc logs -f https://github.com/drycc/drycc/issues/465

+

Teams and Permissions

+

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:

+ +

Monitoring

+ +

Workflow Addons/Services

+

Developers should be able to quickly and easily provision application +dependencies using a services or addon abstraction. +https://github.com/drycc/drycc/issues/231

+

Inbound/Outbound Webhooks

+

Drycc Workflow should be able to send and receive webhooks from external +systems. Facilitating integration with third party services like GitHub, +Gitlab, Slack, Hipchat.

+ + +
+ + + + + + + + + + + +
+ +

3 - Releases

+
Drycc’s release model allows applications to record and roll back to previous versions.
+

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.

+

Components Release as Needed

+

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.

+

Workflow Releases Each Month

+

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.

+

Semantic Versioning

+

Drycc releases comply with semantic versioning, with the “public API” broadly +defined as:

+
    +
  • REST, gRPC, or other API that is network-accessible
  • +
  • Library or framework API intended for public use
  • +
  • “Pluggable” socket-level protocols users can redirect
  • +
  • CLI commands and output formats
  • +
+

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.

+

How to Release a Component

+

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.

+

Step 1: Update Code and Run the Release Tool

+

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
+

Step 2: Verify the Component is Available

+

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}
+

How to Release Workflow

+

Drycc Workflow integrates multiple component releases together with a Kubernetes Helm chart +deliverable. This section leads a maintainer through creating a Workflow release.

+

Step 1: Set Environment Variables

+

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
+

Step 2: Tag Supporting Repositories

+

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.

+

Step 3: Create Helm Chart

+

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.

+

Step 4: Manual Testing

+

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:

+
    +
  1. Create a component PR that fixes the bug.
  2. +
  3. Once the PR passes and is reviewed, merge it and do a new +component release
  4. +
  5. Trigger the same workflow-chart-stage job as mentioned in Step 3 to upload the newly-generated Workflow release candidate chart to staging.
  6. +
+

Step 5: Release the Chart

+

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.

+

Step 6: Assemble Master Changelog

+

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.

+

Step 7: Update Documentation

+

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.

+

Step 8: Close GitHub Milestones

+

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.

+

Step 9: Release Workflow CLI Stable

+

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)
+

Step 10: Let Everyone Know

+

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!

+ +
+ + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/docs/roadmap/index.html b/docs/roadmap/index.html new file mode 100644 index 000000000..b0f0df54e --- /dev/null +++ b/docs/roadmap/index.html @@ -0,0 +1,472 @@ + + + + + + + + + + + + + + + + + + + + + +Roadmap | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Roadmap

+
Browse the ever-growing list of up-to-date, community driven roadmaps.
+ + +
+ + +
+
+
+ Planning Process +
+

Drycc features a lightweight process that emphasizes openness and ensures every community member can be an integral part of planning for the future.

+
+
+
+ Drycc Workflow Roadmap +
+

Drycc roadmap is community driven and managed through GitHub.

+
+
+
+ Releases +
+

Drycc’s release model allows applications to record and roll back to previous versions.

+
+
+ +
+ + + + + + +
+ +
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/roadmap/index.xml b/docs/roadmap/index.xml new file mode 100644 index 000000000..c528643e3 --- /dev/null +++ b/docs/roadmap/index.xml @@ -0,0 +1,292 @@ + + + Drycc – Roadmap + /docs/roadmap/ + Recent content in Roadmap on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Docs: Planning Process + /docs/roadmap/planning-process/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/roadmap/planning-process/ + + + + <h2 id="the-role-of-maintainers">The Role of Maintainers<a class="td-heading-self-link" href="#the-role-of-maintainers" aria-label="Heading self-link"></a></h2> +<p><a href="../contributing/maintainers.md">Maintainers</a> lead the Drycc projects. Their duties include proposing the Roadmap, reviewing and integrating contributions and maintaining the vision of the project.</p> +<h2 id="open-roadmap">Open Roadmap<a class="td-heading-self-link" href="#open-roadmap" aria-label="Heading self-link"></a></h2> +<p>The <a href="/docs/roadmap/roadmap/">Drycc Roadmap</a> is a community document. While Maintainers propose the Roadmap, it gets discussed and refined in Release Planning Meetings.</p> +<h2 id="contributing-to-the-roadmap">Contributing to the Roadmap<a class="td-heading-self-link" href="#contributing-to-the-roadmap" aria-label="Heading self-link"></a></h2> +<p>Proposals and issues can be opened by anyone. Every member of the <a href="../contributing/community.md">community</a> is welcome to participate in the discussion by providing feedback and/or offering counter-proposals.</p> +<h2 id="release-milestones">Release Milestones<a class="td-heading-self-link" href="#release-milestones" aria-label="Heading self-link"></a></h2> +<p>The Roadmap gets delivered progressively via the <a href="/docs/roadmap/releases/">Release Schedule</a>. Releases are defined during Release Planning Meetings and managed using GitHub Milestones which track specific deliverables and work-in-progress.</p> +<h2 id="release-planning-meetings">Release Planning Meetings<a class="td-heading-self-link" href="#release-planning-meetings" aria-label="Heading self-link"></a></h2> +<p>Major decisions affecting the Roadmap are discussed during Release Planning Meetings on the first Thursday of each month, aligned with the <a href="/docs/roadmap/releases/">Release Schedule</a>.</p> +<p>Release Planning Meetings are open to the public with access coordinated via the <a href="https://slack.drycc.cc">Drycc #community Slack channel</a>. +Notes from past meetings are below, along with links to a recording of the entire meeting on YouTube.</p> +<h2 id="credits">Credits<a class="td-heading-self-link" href="#credits" aria-label="Heading self-link"></a></h2> +<p>Thanks to <a href="https://twitter.com/amylindburg">Amy Lindburg</a> and our friends at <a href="https://podman.io/">Podman</a> for their inspiration.</p> + + + + + + Docs: Drycc Workflow Roadmap + /docs/roadmap/roadmap/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/roadmap/roadmap/ + + + + <h1 id="drycc-workflow-roadmap">Drycc Workflow Roadmap<a class="td-heading-self-link" href="#drycc-workflow-roadmap" aria-label="Heading self-link"></a></h1> +<p>The Drycc Workflow Roadmap is a community document created as part of the open +<a href="/docs/roadmap/planning-process/">Planning Process</a>. Each roadmap item describes a high-level capability or +grouping of features that are deemed important to the future of Drycc.</p> +<p>Given the project&rsquo;s rapid <a href="/docs/roadmap/releases/">Release Schedule</a>, roadmap +items are designed to provide a sense of direction over many releases.</p> +<h2 id="interactive-drycc-run-binbash">Interactive <code>drycc run /bin/bash</code><a class="td-heading-self-link" href="#interactive-drycc-run-binbash" aria-label="Heading self-link"></a></h2> +<p>Provide the ability for developers to launch an interactive terminal session in +their application environment.</p> +<p>Related issues:</p> +<ul> +<li><a href="https://github.com/drycc/workflow-cli/issues/28">https://github.com/drycc/workflow-cli/issues/28</a></li> +<li><a href="https://github.com/drycc/drycc/issues/117">https://github.com/drycc/drycc/issues/117</a></li> +</ul> +<h2 id="log-streaming">Log Streaming<a class="td-heading-self-link" href="#log-streaming" aria-label="Heading self-link"></a></h2> +<p>Stream application logs via <code>drycc logs -f</code> <a href="https://github.com/drycc/drycc/issues/465">https://github.com/drycc/drycc/issues/465</a></p> +<h2 id="teams-and-permissions">Teams and Permissions<a class="td-heading-self-link" href="#teams-and-permissions" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>Related issues:</p> +<ul> +<li>Deploy Keys: <a href="https://github.com/drycc/drycc/issues/3875">https://github.com/drycc/drycc/issues/3875</a></li> +<li>Teams: <a href="https://github.com/drycc/drycc/issues/4173">https://github.com/drycc/drycc/issues/4173</a></li> +<li>Fine grained permissions: <a href="https://github.com/drycc/drycc/issues/4150">https://github.com/drycc/drycc/issues/4150</a></li> +<li>Admins create apps only: <a href="https://github.com/drycc/drycc/issues/4052">https://github.com/drycc/drycc/issues/4052</a></li> +<li>Admin Certificate Permissions: <a href="https://github.com/drycc/drycc/issues/4576#issuecomment-170987223">https://github.com/drycc/drycc/issues/4576#issuecomment-170987223</a></li> +</ul> +<h2 id="monitoring">Monitoring<a class="td-heading-self-link" href="#monitoring" aria-label="Heading self-link"></a></h2> +<ul> +<li><input disabled="" type="checkbox"> Define and deliver alerts with Kapacitor: <a href="https://github.com/drycc/monitor/issues/44">https://github.com/drycc/monitor/issues/44</a></li> +</ul> +<h2 id="workflow-addonsservices">Workflow Addons/Services<a class="td-heading-self-link" href="#workflow-addonsservices" aria-label="Heading self-link"></a></h2> +<p>Developers should be able to quickly and easily provision application +dependencies using a services or addon abstraction. +<a href="https://github.com/drycc/drycc/issues/231">https://github.com/drycc/drycc/issues/231</a></p> +<h2 id="inboundoutbound-webhooks">Inbound/Outbound Webhooks<a class="td-heading-self-link" href="#inboundoutbound-webhooks" aria-label="Heading self-link"></a></h2> +<p>Drycc Workflow should be able to send and receive webhooks from external +systems. Facilitating integration with third party services like GitHub, +Gitlab, Slack, Hipchat.</p> +<ul> +<li><input checked="" disabled="" type="checkbox"> Send webhook on platform events: <a href="https://github.com/drycc/drycc/issues/1486">https://github.com/drycc/drycc/issues/1486</a> (Workflow v2.10)</li> +</ul> + + + + + + Docs: Releases + /docs/roadmap/releases/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/roadmap/releases/ + + + + <p>Drycc uses a <a href="https://en.wikipedia.org/wiki/Continuous_delivery">continuous delivery</a> approach for creating releases. Every merged commit that passes +testing results in a deliverable that can be given a <a href="http://semver.org">semantic version</a> tag and shipped.</p> +<p>The master <code>git</code> branch of a project should always work. Only changes considered ready to be +released publicly are merged.</p> +<h2 id="components-release-as-needed">Components Release as Needed<a class="td-heading-self-link" href="#components-release-as-needed" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p>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.</p> +<p>&ldquo;Components&rdquo; 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 <a href="http://semver.org">semantic version</a> releases.</p> +<p>See &ldquo;<a href="/docs/roadmap/releases/#how-to-release-a-component">How to Release a Component</a>&rdquo; for more detail.</p> +<h2 id="workflow-releases-each-month">Workflow Releases Each Month<a class="td-heading-self-link" href="#workflow-releases-each-month" aria-label="Heading self-link"></a></h2> +<p>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 <a href="/docs/roadmap/roadmap/">the Roadmap</a>.</p> +<p>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.</p> +<p>See &ldquo;<a href="/docs/roadmap/releases/#how-to-release-workflow">How to Release Workflow</a>&rdquo; for more detail.</p> +<h2 id="semantic-versioning">Semantic Versioning<a class="td-heading-self-link" href="#semantic-versioning" aria-label="Heading self-link"></a></h2> +<p>Drycc releases comply with <a href="http://semver.org">semantic versioning</a>, with the &ldquo;public API&rdquo; broadly +defined as:</p> +<ul> +<li>REST, gRPC, or other API that is network-accessible</li> +<li>Library or framework API intended for public use</li> +<li>&ldquo;Pluggable&rdquo; socket-level protocols users can redirect</li> +<li>CLI commands and output formats</li> +</ul> +<p>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.</p> +<h2 id="how-to-release-a-component">How to Release a Component<a class="td-heading-self-link" href="#how-to-release-a-component" aria-label="Heading self-link"></a></h2> +<p>Most Drycc projects are &ldquo;components&rdquo; which produce a Container image or binary executable as a +deliverable. This section leads a maintainer through creating a component release.</p> +<h3 id="step-1-update-code-and-run-the-release-tool">Step 1: Update Code and Run the Release Tool<a class="td-heading-self-link" href="#step-1-update-code-and-run-the-release-tool" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<p><strong>Note:</strong> if a patch release, the release artifact will have to be manually promoted by triggering +the <a href="https://ci.drycc.info/job/component-promote">component-promote</a> job with the following values:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#000">COMPONENT_NAME</span><span style="color:#ce5c00;font-weight:bold">=</span>&lt;component name&gt; +</span></span><span style="display:flex;"><span><span style="color:#000">COMPONENT_SHA</span><span style="color:#ce5c00;font-weight:bold">=</span>&lt;patch commit sha&gt; +</span></span></code></pre></div><p>Make sure you have the <a href="https://github.com/drycc/dryccrel">dryccrel</a> release tool in your search <code>$PATH</code>.</p> +<p>Run <code>dryccrel release</code> once with a fake semver tag to proofread the changelog content. (If <code>HEAD</code> +of master is not what is intended for the release, add the <code>--sha</code> flag as described +in <code>dryccrel release --help</code>.)</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ dryccrel release controller v0.0.0 +</span></span><span style="display:flex;"><span>Doing a dry run of the component release... +</span></span><span style="display:flex;"><span>skipping commit 943a49267eeb28546819a266654806cfcbae0e38 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>Creating changelog <span style="color:#204a87;font-weight:bold">for</span> controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#8f5902;font-style:italic">### v2.8.1 -&gt; v0.0.0</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#8f5902;font-style:italic">#### Fixes</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>- <span style="color:#ce5c00;font-weight:bold">[</span><span style="color:#4e9a06">`</span>615b834<span style="color:#4e9a06">`</span><span style="color:#ce5c00;font-weight:bold">](</span>https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731<span style="color:#ce5c00;font-weight:bold">)</span> boot: Ensure <span style="color:#000">DRYCC_DEBUG</span><span style="color:#ce5c00;font-weight:bold">==</span><span style="color:#204a87">true</span> <span style="color:#204a87;font-weight:bold">for</span> debug output +</span></span></code></pre></div><p>Based on the changelog content, determine whether the component deserves a minor or patch +release. Run the command again with that semver tag and <code>--dry-run=false</code>. You will still be +asked for confirmation before the release is created:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ dryccrel release controller v2.8.2 --dry-run<span style="color:#ce5c00;font-weight:bold">=</span><span style="color:#204a87">false</span> +</span></span><span style="display:flex;"><span>skipping commit 943a49267eeb28546819a266654806cfcbae0e38 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>Creating changelog <span style="color:#204a87;font-weight:bold">for</span> controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38 +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#8f5902;font-style:italic">### v2.8.1 -&gt; v2.8.2</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span><span style="color:#8f5902;font-style:italic">#### Fixes</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>- <span style="color:#ce5c00;font-weight:bold">[</span><span style="color:#4e9a06">`</span>615b834<span style="color:#4e9a06">`</span><span style="color:#ce5c00;font-weight:bold">](</span>https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731<span style="color:#ce5c00;font-weight:bold">)</span> boot: Ensure <span style="color:#000">DRYCC_DEBUG</span><span style="color:#ce5c00;font-weight:bold">==</span><span style="color:#204a87">true</span> <span style="color:#204a87;font-weight:bold">for</span> debug output +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>Please review the above changelog contents and ensure: +</span></span><span style="display:flex;"><span> 1. All intended commits are mentioned +</span></span><span style="display:flex;"><span> 2. The changes agree with the semver release tag <span style="color:#ce5c00;font-weight:bold">(</span>major, minor, or patch<span style="color:#ce5c00;font-weight:bold">)</span> +</span></span><span style="display:flex;"><span> +</span></span><span style="display:flex;"><span>Create release <span style="color:#204a87;font-weight:bold">for</span> Drycc Controller v2.8.2? <span style="color:#ce5c00;font-weight:bold">[</span>y/n<span style="color:#ce5c00;font-weight:bold">]</span>: y +</span></span><span style="display:flex;"><span>New release is available at https://github.com/drycc/controller/releases/tag/v2.8.2 +</span></span></code></pre></div><h3 id="step-2-verify-the-component-is-available">Step 2: Verify the Component is Available<a class="td-heading-self-link" href="#step-2-verify-the-component-is-available" aria-label="Heading self-link"></a></h3> +<p>Tagging the component (see <a href="/roadmap/releases/#step-1-update-code-and-run-the-release-tool">Step 1</a>) +starts a CI job that eventually results in an artifact being made available for public download. +Please see the <a href="https://github.com/drycc/jenkins-jobs/#flow">CI flow diagrams</a> for details.</p> +<p>Double-check that the artifact is available, either by a <code>podman pull</code> command or by running the +appropriate installer script.</p> +<p>If the artifact can&rsquo;t be downloaded, ensure that its CI release jobs are still in progress, or +fix whatever issue arose in the pipeline. For example, the +<a href="https://github.com/drycc/jenkins-jobs/#when-a-component-pr-is-merged-to-master">master merge pipeline</a> +may have failed to promote the <code>:git-abc1d23</code> candidate image and needs to be restarted with +that component and commit.</p> +<p>If the component has a correlating <a href="https://github.com/kubernetes/helm">Kubernetes Helm</a> chart, +this chart will also be packaged, signed and uploaded to its production chart repo. Please +verify it can be fetched (and verified):</p> +<pre tabindex="0"><code>$ helm fetch oci://registry.drycc.cc/charts/controller --version 1.0.0 +Verification: &amp;{0xc4207ec870 sha256:026e766e918ff28d2a7041bc3d560d149ee7eb0cb84165c9d9d00a3045ff45c3 controller-v1.0.1.tgz} +</code></pre><h2 id="how-to-release-workflow">How to Release Workflow<a class="td-heading-self-link" href="#how-to-release-workflow" aria-label="Heading self-link"></a></h2> +<p>Drycc Workflow integrates multiple component releases together with a <a href="https://github.com/kubernetes/helm">Kubernetes Helm</a> chart +deliverable. This section leads a maintainer through creating a Workflow release.</p> +<h3 id="step-1-set-environment-variables">Step 1: Set Environment Variables<a class="td-heading-self-link" href="#step-1-set-environment-variables" aria-label="Heading self-link"></a></h3> +<p>Export two environment variables that will be used in later steps:</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#204a87">export</span> <span style="color:#000">WORKFLOW_RELEASE</span><span style="color:#ce5c00;font-weight:bold">=</span>v2.17.0 <span style="color:#000">WORKFLOW_PREV_RELEASE</span><span style="color:#ce5c00;font-weight:bold">=</span>v2.16.0 <span style="color:#8f5902;font-style:italic"># for example</span> +</span></span></code></pre></div><h3 id="step-2-tag-supporting-repositories">Step 2: Tag Supporting Repositories<a class="td-heading-self-link" href="#step-2-tag-supporting-repositories" aria-label="Heading self-link"></a></h3> +<p>Some Workflow components not in the Helm chart must also be tagged in sync with the release. +Follow the <a href="/docs/roadmap/releases/#how-to-release-a-component">component release process</a> above and ensure that +these components are tagged:</p> +<ul> +<li><a href="https://github.com/drycc/workflow-cli">drycc/workflow-cli</a></li> +<li><a href="https://github.com/drycc/workflow-e2e">drycc/workflow-e2e</a></li> +</ul> +<p>The version number for <a href="https://github.com/drycc/workflow-cli">drycc/workflow-cli</a> should always match the overall Workflow version +number.</p> +<h3 id="step-3-create-helm-chart">Step 3: Create Helm Chart<a class="td-heading-self-link" href="#step-3-create-helm-chart" aria-label="Heading self-link"></a></h3> +<p>To create and stage a release candidate chart for Workflow, we will build the <a href="https://ci.drycc.info/job/workflow-chart-stage">workflow-chart-stage</a> job with the following parameters:</p> +<p><code>RELEASE_TAG=$WORKFLOW_RELEASE</code></p> +<p>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.</p> +<h3 id="step-4-manual-testing">Step 4: Manual Testing<a class="td-heading-self-link" href="#step-4-manual-testing" aria-label="Heading self-link"></a></h3> +<p>Now it&rsquo;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.</p> +<p>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.</p> +<p>When showstopper-level bugs are found, the process is as follows:</p> +<ol> +<li>Create a component PR that fixes the bug.</li> +<li>Once the PR passes and is reviewed, merge it and do a new +<a href="/docs/roadmap/releases/#how-to-release-a-component">component release</a></li> +<li>Trigger the same <code>workflow-chart-stage</code> job as mentioned in Step 3 to upload the newly-generated Workflow release candidate chart to staging.</li> +</ol> +<h3 id="step-5-release-the-chart">Step 5: Release the Chart<a class="td-heading-self-link" href="#step-5-release-the-chart" aria-label="Heading self-link"></a></h3> +<p>When testing has completed without uncovering any new showstopper bugs, kick off the <a href="https://ci.drycc.info/job/workflow-chart-release">workflow-chart-release</a> job with the following parameter:</p> +<p><code>RELEASE_TAG=$WORKFLOW_RELEASE</code></p> +<p>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.</p> +<h3 id="step-6-assemble-master-changelog">Step 6: Assemble Master Changelog<a class="td-heading-self-link" href="#step-6-assemble-master-changelog" aria-label="Heading self-link"></a></h3> +<p>Each component already updated its release notes on GitHub with CHANGELOG content. We&rsquo;ll now +generate the master changelog for the Workflow chart, consisting of all component and auxilliary repo changes.</p> +<p>We&rsquo;ll employ the <code>requirements.lock</code> file from the <code>WORKFLOW_PREV_RELEASE</code> chart, as well as a repo-to-chart-name <a href="https://github.com/drycc/dryccrel/blob/main/map.json">mapping file</a>, this time invoking <code>dryccrel changelog global</code> to get all component changes between +the chart versions existing in the <code>WORKFLOW_PREV_RELEASE</code> chart and the <em>most recent</em> releases existing in GitHub. +(Therefore, if there are any unreleased commits in a component repo, they will not appear here):</p> +<div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm fetch --untar oci://registry.drycc.cc/charts/workflow --version <span style="color:#000">$WORKFLOW_PREV_RELEASE</span> +</span></span><span style="display:flex;"><span>dryccrel changelog global workflow/requirements.lock map.json &gt; changelog-<span style="color:#000">$WORKFLOW_RELEASE</span>.md +</span></span></code></pre></div><p>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.</p> +<h3 id="step-7-update-documentation">Step 7: Update Documentation<a class="td-heading-self-link" href="#step-7-update-documentation" aria-label="Heading self-link"></a></h3> +<p>Create a new pull request at <a href="https://github.com/drycc/workflow">drycc/workflow</a> that updates version references to the new release. +Use <code>git grep $WORKFLOW_PREV_RELEASE</code> to find any references, but be careful not to change +<code>CHANGELOG.md</code>.</p> +<p>Place the <code>$WORKFLOW_RELEASE</code> master changelog generated in Step 7 in the <code>changelogs</code> directory. +Make sure to add a header to the page to make it clear that this is for a Workflow release, e.g.:</p> +<pre tabindex="0"><code>## Workflow v2.16.0 -&gt; v2.17.0 +</code></pre><p>Once the PR has been reviewed and merged, do a <a href="/docs/roadmap/releases/#how-to-release-a-component">component release</a> of +<a href="https://github.com/drycc/workflow">drycc/workflow</a> itself. The version number for <a href="https://github.com/drycc/workflow">drycc/workflow</a> should always match the +overall Workflow version number.</p> +<h3 id="step-8-close-github-milestones">Step 8: Close GitHub Milestones<a class="td-heading-self-link" href="#step-8-close-github-milestones" aria-label="Heading self-link"></a></h3> +<p>Create a pull request at <a href="https://github.com/drycc/seed-repo">seed-repo</a> 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.</p> +<p>Milestones map to Drycc Workflow releases in <a href="https://github.com/drycc/workflow">drycc/workflow</a>. These milestones do not correspond +to individual component release tags.</p> +<h3 id="step-9-release-workflow-cli-stable">Step 9: Release Workflow CLI Stable<a class="td-heading-self-link" href="#step-9-release-workflow-cli-stable" aria-label="Heading self-link"></a></h3> +<p>Now that the <code>$WORKFLOW_RELEASE</code> version of Workflow CLI has been vetted, we can push <code>stable</code> artifacts based on this version.</p> +<p>Kick off <a href="https://ci.drycc.info/job/workflow-cli-build-stable/">https://ci.drycc.info/job/workflow-cli-build-stable/</a> with the <code>TAG</code> build parameter of <code>$WORKFLOW_RELEASE</code> +and then verify <code>stable</code> artifacts are available and appropriately updated after the job completes:</p> +<pre tabindex="0"><code>$ curl -sfL https://www.drycc.cc/install-cli.sh | bash - +$ ./drycc version +# (Should show $WORKFLOW_RELEASE) +</code></pre><h3 id="step-10-let-everyone-know">Step 10: Let Everyone Know<a class="td-heading-self-link" href="#step-10-let-everyone-know" aria-label="Heading self-link"></a></h3> +<p>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:</p> +<pre tabindex="0"><code>@here Drycc Workflow v2.17.0 is now live! +Master CHANGELOG: https://drycc.info/docs/workflow/changelogs/v2.17.0/ +</code></pre><p>You&rsquo;re done with the release. Nice job!</p> + + + + + + diff --git a/docs/roadmap/planning-process/index.html b/docs/roadmap/planning-process/index.html new file mode 100644 index 000000000..32bb64c10 --- /dev/null +++ b/docs/roadmap/planning-process/index.html @@ -0,0 +1,478 @@ + + + + + + + + + + + + + + + + + + + +Planning Process | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Planning Process

+
Drycc features a lightweight process that emphasizes openness and ensures every community member can be an integral part of planning for the future.
+ +

The Role of Maintainers

+

Maintainers lead the Drycc projects. Their duties include proposing the Roadmap, reviewing and integrating contributions and maintaining the vision of the project.

+

Open Roadmap

+

The Drycc Roadmap is a community document. While Maintainers propose the Roadmap, it gets discussed and refined in Release Planning Meetings.

+

Contributing to the Roadmap

+

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.

+

Release Milestones

+

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.

+

Release Planning Meetings

+

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.

+

Credits

+

Thanks to Amy Lindburg and our friends at Podman for their inspiration.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/roadmap/releases/index.html b/docs/roadmap/releases/index.html new file mode 100644 index 000000000..4a6f269e0 --- /dev/null +++ b/docs/roadmap/releases/index.html @@ -0,0 +1,658 @@ + + + + + + + + + + + + + + + + + + + +Releases | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Releases

+
Drycc’s release model allows applications to record and roll back to previous versions.
+ +

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.

+

Components Release as Needed

+

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.

+

Workflow Releases Each Month

+

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.

+

Semantic Versioning

+

Drycc releases comply with semantic versioning, with the “public API” broadly +defined as:

+
    +
  • REST, gRPC, or other API that is network-accessible
  • +
  • Library or framework API intended for public use
  • +
  • “Pluggable” socket-level protocols users can redirect
  • +
  • CLI commands and output formats
  • +
+

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.

+

How to Release a Component

+

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.

+

Step 1: Update Code and Run the Release Tool

+

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
+

Step 2: Verify the Component is Available

+

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}
+

How to Release Workflow

+

Drycc Workflow integrates multiple component releases together with a Kubernetes Helm chart +deliverable. This section leads a maintainer through creating a Workflow release.

+

Step 1: Set Environment Variables

+

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
+

Step 2: Tag Supporting Repositories

+

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.

+

Step 3: Create Helm Chart

+

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.

+

Step 4: Manual Testing

+

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:

+
    +
  1. Create a component PR that fixes the bug.
  2. +
  3. Once the PR passes and is reviewed, merge it and do a new +component release
  4. +
  5. Trigger the same workflow-chart-stage job as mentioned in Step 3 to upload the newly-generated Workflow release candidate chart to staging.
  6. +
+

Step 5: Release the Chart

+

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.

+

Step 6: Assemble Master Changelog

+

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.

+

Step 7: Update Documentation

+

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.

+

Step 8: Close GitHub Milestones

+

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.

+

Step 9: Release Workflow CLI Stable

+

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)
+

Step 10: Let Everyone Know

+

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!

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/roadmap/roadmap/index.html b/docs/roadmap/roadmap/index.html new file mode 100644 index 000000000..fbab9907a --- /dev/null +++ b/docs/roadmap/roadmap/index.html @@ -0,0 +1,508 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow Roadmap | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Drycc Workflow Roadmap

+
Drycc roadmap is community driven and managed through GitHub.
+ +

Drycc Workflow Roadmap

+

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.

+

Interactive drycc run /bin/bash

+

Provide the ability for developers to launch an interactive terminal session in +their application environment.

+

Related issues:

+ +

Log Streaming

+

Stream application logs via drycc logs -f https://github.com/drycc/drycc/issues/465

+

Teams and Permissions

+

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:

+ +

Monitoring

+ +

Workflow Addons/Services

+

Developers should be able to quickly and easily provision application +dependencies using a services or addon abstraction. +https://github.com/drycc/drycc/issues/231

+

Inbound/Outbound Webhooks

+

Drycc Workflow should be able to send and receive webhooks from external +systems. Facilitating integration with third party services like GitHub, +Gitlab, Slack, Hipchat.

+ + + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/security/1d6a97d0.txt b/docs/security/1d6a97d0.txt new file mode 100644 index 000000000..0282082c5 --- /dev/null +++ b/docs/security/1d6a97d0.txt @@ -0,0 +1,92 @@ +sec 4096R/1D6A97D0 2016-11-03 + Key fingerprint = 41AF 6B6A 9489 9B58 1EB6 9ED1 17E5 26B5 1D6A 97D0 +uid Drycc, Inc. (Helm chart signing key) +ssb 4096R/2CA931B0 2016-11-03 +ssb 4096R/41C9CA1E 2016-11-03 [expires: 2024-11-01] + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +mQINBFgbpCIBEACeZsh7wsilg+gAGPUrL3u0YUO66qWPP2fjj72MYbv8Cmqd8lEf +t7uC7+foUhEtnS2Y+xxjNlEtPi3etE6wheGJdIhHunWQKarU/tZtuh1bkPrVeLdT +aXslefS9SXWTHxqHZESJyJR1bFNrFBdND1rmTNqYi3Bkh22sgcmSsb+GgWly8JzI +qphl9xg26VuAgMJ8IsILgNbi6CvgmBzFZqVgYU/gtR8cD6VDSCBKnFm9eFzBu39q +nIa6Hdtf/MsspgyrcYfPTjt6/77FNtC3ThI361zSxVtUBBdOF4Dutwsl5QfdFryA +hOY9ix7kNerLIXNturmLqoXLiszlpJL/yC9TGNzbi553T+JDCdK/qzfOsrcmAWhd +L7txnGwSs5KkzVnknZw2c65UGrKheFlT2LjZrtTBZ3ZLJ9n6KvRUOqTwNs6/oKCb +hPyq1nUIO8l8LstKJmlW8tTSceVvsYJV1jNwSFNPlNWW0mgRB2v2wUNpPToSTsFP +bzwjnsOOVezbOoUnq02SIWXO7dCC0S8v5wZaRPmUN3xEEd129GHI8/LW7qdxpimh +npbgUShB3zuA8N/X0VGkw3OfWdzS0beeQbSgVtxYDM6/2TIf4Hx9aDsKkRZe8aIk +LhF6+zUEjr3oMjcFWVXKxYJSRc9KsXtsJr+RF6qC59phmLkZtTHk4k+aAQARAQAB +tDdEZWlzLCBJbmMuIChIZWxtIGNoYXJ0IHNpZ25pbmcga2V5KSA8c2VjdXJpdHlA +ZGVpcy5jb20+iQI5BBMBCAAjBQJYG6QiAhsDBwsJCAcDAgEGFQgCCQoLBBYCAwEC +HgECF4AACgkQF+UmtR1ql9CeFw//WPlST2zv3TaZ5b+khWp3vv61yRiUH35Dq6uH +4oCHLCr/H7pEJX1KE/AXJzFyTrQV+VZVzgIjyNZqyKd6s8Ny4zfXVwCLPAh9Qnfz +deb8WHXdXxNta69egeiGAKpjJh5H9LOMHwfKL1L60d+TmlCPkg5Se9YMW4cPikYp +6qspIOa90xrF3slzvbnp2cYV02R7BMPgEMHRkmZDLXQ0ckEGRV+KV42vzB04OiBf +A9GpLmVn1n8v45Wo9akGQvpOg1Z9RQC/+wiRjy60TtHZm+G03Z5cel0f2J3Pb3TB +xBjVo7s7DedddxAHlEBNLZPrxIGig8fWwWsILow/s16bfRSP+Qoo+rTaQkTkh/1m +6mYrnji/SRwafZ1gRcBYwUyiAv7rEsINOr5DEI6S+pTuTKl+hdA0SgvSGwQ3fCTJ +YQxghdK/dsZn80dxZj2xBApHd7NxuvPl94hIiYjEF3OeCZio/El5a3Aj+C83JSkv +KOPd7S8fakQBuCAD0QqPSGXuv0gFXwiodqjjpePpZhIcuqvPWT7rkxJewJgIUBlY +0AL8rUdHZa4zMI+eGD6FX22VrutpTciaX786CN/5jlVDxIKCZASHkHn6rprOZo9b +1+3a9Xe0K+NpZ62F28A/nhQ+e2SB0n1SI/0J4N9BO866i5RybFyKhLWaeLCWm37J +j9PoHMm5Ag0EWBukIgEQALr3f5QBpNQUoqEtWwewR4hXrk66zR+sBpcspunldB6a +avUCFFCoUS7tbnlOeA4i5LFX8IZ8UXKz2wLpCWwuAqjwTA3YzI6KGwLao7lg18le +nomTThwDbOBrZ/tmMsh71310SGhnpwNaDr0jzH1XduzvljpP7tZNcIAyQOqfWaES +74qmGb4LfTofjbpKrg0zPh1P08VXcR8bjFSNf4M/Vlprb27US/ExPn8Fgpf7ddgo +L0rTG6cVxAbwM1KThRhM0zopQcl9owA9aulXEx0bb5VAfAyjG86QVhUOYpKccDYm +1PdLqAxXLZGWOsU/miDlTjWY4CbC0HZPAK4yyABafgdWf0sRBv6sAXtElu3zOQqy +pIBaQdq5HomseOqrb5HZs1TFz7fGDLsbT6E2CJHbMM5xUhdDwr3OlWLkJjn6mAkQ +Z0VWYjYyMAuvHIAdJZ6OwRcaJ1xKKc1GMEujeyColVVdKEGSE31ROvDZaR+zUM1m +2YGK+XYHXO6nJyHjcvQ3Uh1dCnqeQvgIFyUwLQi+FwEeYgc86BPzeK8ouIjPHQY0 +MinmSJv/kbHJn4DhsdaIdQVMhgDVOWwBfJS8+osDrU/Js2j+kiq/BjPV3gXuctOM +aJYWMPNgMTLx0ROrso5wU7NHsQUVCN5Qv+6iJjpaHr9aQu2YuUO7eONtAD35B2MZ +ABEBAAGJAh8EGAEIAAkFAlgbpCICGwwACgkQF+UmtR1ql9ByLA/+JRYLt8uioAzd +ySBFap/w7ntNq7A6cOU2zmHt0AA9JX3NT2r4tfmIE54CNH8WxjAnnXsr13tdOPoN +bbg2cdKYEdK6xaOg84kqrNiZ2+n93ll5I2Puhh2/eip8EiWURnPfKtM6PX7o6cPS +EDZ8EyJ9lDSwUfIiMg8sNEv8OBKq3prl9b4B7JzLr9QLE/S9ek5z4mri6MBXwb/I ++XKuY/YTQswRX7os7XRk8MbQuppRLfyTXH9aM5AwNMZXmU5MIK5Gu4sv41wGUIzu +4GqeGVOmLFUnYUE/rNNZFH1HEAQj9QH6DqCqkgDLUNMQUGaWZRmmgHRZRyfCLkM0 +f/wVIGiCPuMF0vxqAVA/QQVPn92Ul1SmznNjAf9nnjZwKC+ubEIQ7cXphkNJAql9 +ccNRIdGxhEQzjzRnySkxHQsWw8Ly2Bwz/NzumPzkoNZ1a3X7dHVeKaYo/HIUMAph +Um4N5yBvXSiZY8/94FfDVSstXGqt3kZhK82h2yvqiHIpUcFMxNLFpTXcdzRHrSnN +ATzk/4Au1krHIj1KcxyjXYt2M+alXkSsLyK8nf3vrPX+zzbB1ZQwKPohPwmKCFFj +u9fo6JM921U98SuWduRe5u0pU7ZBQB9NPsSrXSz8mZ5lfPJP90sKxFYBHDN6bSaD +G5d76sWHAg/xaw8kfPNc0GSbtudOFGm5Ag0EWBukpAEQAKRxaVOfurtp9ZK9kBQf +dlAUz7I18OCtGS01rPM64kvSdIOB91sjPDiDs81C6nX/Bqso8QM112Ms9PLeTANy +Rs2BhnwprG1BMqCFUyykzrR2Fpkq3C0aqLMLId8SVisCasOxi5w3CjvEulfqDeZN +e7dA+/sFwNryU8q65eQTd43JOQZtX0xrdfv/RQkSgsLlQb7txIcPayM87yWzIn6U +pBvwaMV6K4Puq7LCNsNt/vF62xUhttjlv0De23THkeiieOBtS0cL8Wmp1XtilNpF +BzwjaKl/tP9G+/TJr3jx8G02nvR9/STXxW6SUb9su5reRmP5Jk42tRTVI857xX6j +oOmGtbec8tbEBzOoCBHOOGK+FqjHT1FiPn6EY8BGnqFy0ArBuEGyvpw/X2QZC03D +tIl6k3vj8Lz8X2ucCWwzqTZJ+/IKaA6HBF5glWl8U3aNspCi+SnPsTJVQ9cQtxdc +DLzRXXmyb6q1LZlpig+wWqr6LqLTtjgeGRh64mKNVUkSDT108B9mplRA6HYjZQw9 +YbWAs6EQFfDesObhjVjhdDKsU7dri1nVtbzdVEOPN6Rz4Uogzr8flYLchgkHyBJG +EO9bYzqeu7F2vFzZmTaWimai8xqyXliClBTZwUB3LfujDpWbNteNA7LaPYk1DNsY +mOpY9UWPRlpBQXCGINDyCpQrABEBAAGJBEQEGAEIAA8FAlgbpKQCGwIFCQ8JnAAC +KQkQF+UmtR1ql9DBXSAEGQEIAAYFAlgbpKQACgkQJ8N4N0HJyh6JkA//cshmimC/ +8z+wepXIyTkphlvtmxHUoJHReqoWM4ofN542M3Txyr3UouBdE8sYtIx30DXVu12F +WJjLPXXYD/mENpmvRP+0ScbKcKYnVK8A2vmtCl5GBRkIKN3qqEUUGPWeWfzpAZOH +rw+f0/EdpzRxQqDdXtKUO2CM6k2ao5k7KVcGLq2aI6zr80EsyPc+nOx4k7IQBuPz +lRvlFK3QQVL4F8SqrOcbuYClaUGcx0YoL6tY6uTrZvVDzsr71h2IfgzyoxWLyzuo +FB/wABHUhnAJQB0T6kv89xUOogpK6dgGCDHbq2P7jDdbCbLgjKwMYbG780M0KKud +2eAJg2pSRgQxcVbdKS4CSXBCfmRXVJuHPDhi9BXrUMcYqUPCpicXhNgKd0EdOu22 +exKrL7a3Tpz0pHLiRTrUU4zEvZEASQJzaaL3Qvf62m0PR4STb0wmGJ40DxrwFmWp +pDA2k7VPAf3LST4YGt9ytwG372oF/02NclrXRah8DeJkokjxHA9vuY3mm2MqYccu +qL9aSM8qmutpnxVEIFhOZWtmxN6WNsAK37/T59LIdnBX3UA787ydztSHJm2L8EPN +g4jTKAzeVGTQzd2fbIxPidqQCZn5btkjpFvwE6nH5RVojhvipgFf4udsWxPPMSmU +/ezoPxrWps08CqWPG2qPJL+sV3A6P5NwdbBfCw//YnHF5fa2azPSjIKBrftpCoyC +mSJnxOj23Kk9gD7w/a/D+ODxNyxzRjFs/xpceJZi0SIcbKw+9rOPYsrunH27abxb +IPXgvSFLNTbLx9jcSXaW+fkNdlDYEZcWhqTHDyRau9BoXdgSm2nY3luMAkxMIQAC +m2HvHsB63fIxSEPRM0QEmi7yBk3f2QyUPvus7IcgEidbSmEpZxaOY8D79nzgfgh/ +WzggxpvZPdT664s6nhTLGxp2UD6wAlA2lSkIWrCPB3ZT5p58KcIBULtpb6mN5rWs +D0UEEEMOMIwWlBqgDyrYylemPMks9GuMC1X7ANsbpjhwxjikyMLFFUBHa301CpHy +k2fqCwvhidCoz8Y9e5V1sUSuoHtHeiikK7chUTDBH6no6bUT+8JZNScqw8jYV9cD +4F01NhHO5OAuECIf0IszwslD6t1jVdTbwVL7hrRATDPMtxsPsFir8sPrT2EAk0MV +lM1wNw60FMVgl23ok88EH02Q8a0Vp/P3zzMzK3Vj0DqcERpWIm+QR4wJhQnC397K +o4Z4WknuB0oPZqVqgJzi8j5JTW8phgT/0rxFj1KA1yBiwudJBaRofQNQqK3NSYWe +VB/69T2Srvd3e4V7dtSLuWI/JGjoIoC8TTK+OsDC4RN3w+5mYyfBwAZCABRrTXB+ +K8I9jWQf2UCagoUuV3w= +=qap/ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/docs/troubleshooting/_print/index.html b/docs/troubleshooting/_print/index.html new file mode 100644 index 000000000..186c3838b --- /dev/null +++ b/docs/troubleshooting/_print/index.html @@ -0,0 +1,402 @@ + + + + + + + + + + + + + + + + + + + + + +Troubleshooting | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Troubleshooting

+
Troubleshooting is systematic approach to problem-solving.
+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + +
+ +

1 - Troubleshooting Workflow

+
Common issues that users have run into when provisioning Workflow are detailed below.
+

A Component Fails to Start

+

For information on troubleshooting a failing component, see +Troubleshooting with Kubectl.

+

An Application Fails to Start

+

For information on troubleshooting application deployment issues, see +Troubleshooting Applications.

+

Permission denied (publickey)

+

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.

+

Other Issues

+

Running into something not detailed here? Please open an issue or hop into +#community on Slack for help!

+ +
+ + + + + + + + + + + +
+ +

2 - Troubleshooting using Kubectl

+
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 use kubectl to debug any issues with the cluster.

+

Diving into the Components

+

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)
+
+ +
+ + + + + + + + + + + +
+ +

3 - Troubleshooting Applications

+
This document describes how one can troubleshoot common issues when deploying or debugging an application that fails to start or deploy.
+

Application has a Dockerfile, but a Buildpack Deployment Occurs

+

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:

+
    +
  1. Are you deploying the correct project?
  2. +
  3. Are you pushing the correct git branch (git push drycc <branch>)?
  4. +
  5. Is the Dockerfile in the project’s root directory?
  6. +
  7. Have you committed the Dockerfile to the project?
  8. +
+

Application was Deployed, but is Failing to Start

+

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.

+ +
+ + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/docs/troubleshooting/applications/index.html b/docs/troubleshooting/applications/index.html new file mode 100644 index 000000000..aa230437c --- /dev/null +++ b/docs/troubleshooting/applications/index.html @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + +Troubleshooting Applications | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Troubleshooting Applications

+
This document describes how one can troubleshoot common issues when deploying or debugging an application that fails to start or deploy.
+ +

Application has a Dockerfile, but a Buildpack Deployment Occurs

+

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:

+
    +
  1. Are you deploying the correct project?
  2. +
  3. Are you pushing the correct git branch (git push drycc <branch>)?
  4. +
  5. Is the Dockerfile in the project’s root directory?
  6. +
  7. Have you committed the Dockerfile to the project?
  8. +
+

Application was Deployed, but is Failing to Start

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/troubleshooting/index.html b/docs/troubleshooting/index.html new file mode 100644 index 000000000..2cd746979 --- /dev/null +++ b/docs/troubleshooting/index.html @@ -0,0 +1,472 @@ + + + + + + + + + + + + + + + + + + + + + +Troubleshooting | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Troubleshooting

+
Troubleshooting is systematic approach to problem-solving.
+ + +
+ + +
+
+
+ Troubleshooting Workflow +
+

Common issues that users have run into when provisioning Workflow are detailed below.

+
+
+
+ Troubleshooting using Kubectl +
+

Kubernetes provides a command line tool for communicating with a Kubernetes cluster’s control plane, using the Kubernetes API.

+
+
+
+ Troubleshooting Applications +
+

This document describes how one can troubleshoot common issues when deploying or debugging an application that fails to start or deploy.

+
+
+ +
+ + + + + + +
+ +
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/troubleshooting/index.xml b/docs/troubleshooting/index.xml new file mode 100644 index 000000000..5026e96f0 --- /dev/null +++ b/docs/troubleshooting/index.xml @@ -0,0 +1,179 @@ + + + Drycc – Troubleshooting + /docs/troubleshooting/ + Recent content in Troubleshooting on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Docs: Troubleshooting Workflow + /docs/troubleshooting/workflow/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/troubleshooting/workflow/ + + + + <h2 id="a-component-fails-to-start">A Component Fails to Start<a class="td-heading-self-link" href="#a-component-fails-to-start" aria-label="Heading self-link"></a></h2> +<p>For information on troubleshooting a failing component, see +<a href="/docs/troubleshooting/kubectl/">Troubleshooting with Kubectl</a>.</p> +<h2 id="an-application-fails-to-start">An Application Fails to Start<a class="td-heading-self-link" href="#an-application-fails-to-start" aria-label="Heading self-link"></a></h2> +<p>For information on troubleshooting application deployment issues, see +<a href="/docs/troubleshooting/applications/">Troubleshooting Applications</a>.</p> +<h2 id="permission-denied-publickey">Permission denied (publickey)<a class="td-heading-self-link" href="#permission-denied-publickey" aria-label="Heading self-link"></a></h2> +<p>The most common problem for this issue is the user forgetting to run <code>drycc keys:add</code> or add their +private key to their SSH agent. To do so, run <code>ssh-add ~/.ssh/id_rsa</code> and try running +<code>git push drycc master</code> again.</p> +<p>If you happen get a <code>Could not open a connection to your authentication agent</code> +error after trying to run <code>ssh-add</code> command above, you may need to load the SSH +agent environment variables issuing the <code>eval &quot;$(ssh-agent)&quot;</code> command before.</p> +<h2 id="other-issues">Other Issues<a class="td-heading-self-link" href="#other-issues" aria-label="Heading self-link"></a></h2> +<p>Running into something not detailed here? Please <a href="https://github.com/drycc/workflow/issues/new">open an issue</a> or hop into +<a href="http://slack.drycc.cc/">#community on Slack</a> for help!</p> + + + + + + Docs: Troubleshooting using Kubectl + /docs/troubleshooting/kubectl/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/troubleshooting/kubectl/ + + + + <p>This document describes how one can use <code>kubectl</code> to debug any issues with the cluster.</p> +<h2 id="diving-into-the-components">Diving into the Components<a class="td-heading-self-link" href="#diving-into-the-components" aria-label="Heading self-link"></a></h2> +<p>Using <code>kubectl</code>, one can inspect the cluster&rsquo;s current state. When Workflow is installed +with <code>helm</code>, Workflow is installed into the <code>drycc</code> namespace. To inspect if Workflow is +running, run:</p> +<pre><code>$ 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 +</code></pre> +<p>!!! tip +To save precious keystrokes, alias <code>kubectl --namespace=drycc</code> to <code>kd</code> so it is easier to type +in the future.</p> +<p>To fetch the logs of a specific component, use <code>kubectl logs</code>:</p> +<pre><code>$ 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). +[...] +</code></pre> +<p>To dive into a running container to inspect its environment, use <code>kubectl exec</code>:</p> +<pre><code>$ kubectl --namespace=drycc exec -it drycc-database-56v39 gosu postgres psql +psql (13.4 (Debian 13.4-1.pgdg100+1)) +Type &quot;help&quot; 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 &quot;drycc_controller&quot; as user &quot;postgres&quot;. +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) +</code></pre> + + + + + + Docs: Troubleshooting Applications + /docs/troubleshooting/applications/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/troubleshooting/applications/ + + + + <h2 id="application-has-a-dockerfile-but-a-buildpack-deployment-occurs">Application has a Dockerfile, but a Buildpack Deployment Occurs<a class="td-heading-self-link" href="#application-has-a-dockerfile-but-a-buildpack-deployment-occurs" aria-label="Heading self-link"></a></h2> +<p>When you deploy an application to Workflow using <code>git push drycc master</code> and the <a href="/docs/understanding-workflow/components/#builder">Builder</a> +attempts to deploy using the Buildpack workflow, check the following steps:</p> +<ol> +<li>Are you deploying the correct project?</li> +<li>Are you pushing the correct git branch (<code>git push drycc &lt;branch&gt;</code>)?</li> +<li>Is the <code>Dockerfile</code> in the project&rsquo;s root directory?</li> +<li>Have you committed the <code>Dockerfile</code> to the project?</li> +</ol> +<h2 id="application-was-deployed-but-is-failing-to-start">Application was Deployed, but is Failing to Start<a class="td-heading-self-link" href="#application-was-deployed-but-is-failing-to-start" aria-label="Heading self-link"></a></h2> +<p>If you deployed your application but it is failing to start, you can use <code>drycc logs</code> 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 +<a href="/docs/troubleshooting/kubectl/">troubleshooting using kubectl</a>. You can inspect the application&rsquo;s current +state by examining the pod deployed in the application&rsquo;s namespace. To do that, run</p> +<pre><code>$ kubectl --namespace=myapp get pods +NAME READY STATUS RESTARTS AGE +myapp-web-1585713350-3brbo 0/1 CrashLoopBackOff 2 43s +</code></pre> +<p>We can then describe the pod and determine why it is failing to boot:</p> +<pre><code>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 +</code></pre> +<p>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.</p> +<p>See <a href="/docs/applications/managing-app-configuration/#custom-health-checks">Custom Health Checks</a> for more information on how to customize the application&rsquo;s +health checks to better suit the application&rsquo;s needs.</p> + + + + + + diff --git a/docs/troubleshooting/kubectl/index.html b/docs/troubleshooting/kubectl/index.html new file mode 100644 index 000000000..3d23e9ebb --- /dev/null +++ b/docs/troubleshooting/kubectl/index.html @@ -0,0 +1,530 @@ + + + + + + + + + + + + + + + + + + + +Troubleshooting using Kubectl | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Troubleshooting using Kubectl

+
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 use kubectl to debug any issues with the cluster.

+

Diving into the Components

+

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)
+
+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/troubleshooting/workflow/index.html b/docs/troubleshooting/workflow/index.html new file mode 100644 index 000000000..02d00f43a --- /dev/null +++ b/docs/troubleshooting/workflow/index.html @@ -0,0 +1,478 @@ + + + + + + + + + + + + + + + + + + + +Troubleshooting Workflow | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Troubleshooting Workflow

+
Common issues that users have run into when provisioning Workflow are detailed below.
+ +

A Component Fails to Start

+

For information on troubleshooting a failing component, see +Troubleshooting with Kubectl.

+

An Application Fails to Start

+

For information on troubleshooting application deployment issues, see +Troubleshooting Applications.

+

Permission denied (publickey)

+

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.

+

Other Issues

+

Running into something not detailed here? Please open an issue or hop into +#community on Slack for help!

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/understanding-workflow/_print/index.html b/docs/understanding-workflow/_print/index.html new file mode 100644 index 000000000..8921d8c50 --- /dev/null +++ b/docs/understanding-workflow/_print/index.html @@ -0,0 +1,513 @@ + + + + + + + + + + + + + + + + + + + + + +Understanding Workflow | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Understanding Workflow

+
Understanding the architecture design of workflow.
+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + +
+ +

1 - Concepts

+
Drycc Workflow is a lightweight application platform that deploys and scales Twelve-Factor apps as containers across a Kubernetes cluster.
+

Twelve-Factor Applications

+

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

+

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

+

[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.

+

Applications

+

Workflow is designed around the concept of an application, or app.

+

Applications come in one of three forms:

+
    +
  1. a collection of source files stored in a git repository
  2. +
  3. a Dockerfile and associated source files stored in a git repository
  4. +
  5. a reference to an existing image at a Container repository
  6. +
+

Applications 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.

+

Build, Release, Run

+

Git Push Workflow

+

Build Stage

+

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.

+

Release Stage

+

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.

+

Run Stage

+

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.

+

Backing Services

+

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.

+

See Also

+ + +
+ + + + + + + + + + + +
+ +

2 - Architecture

+
Drycc Workflow is built using a service oriented architecture.
+

All components are published as a set of container images which can be deployed to any +compliant Kubernetes cluster.

+

Overview

+

System Overview

+

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.

+

Platform Services

+

Workflow Overview

+

Drycc Workflow provides additional functionality to your Kubernetes cluster, including:

+ +

Kubernetes-Native

+

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.

+

Workflow and Kubernetes

+

Application Layout and Edge Routing

+

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.

+

Application Configuration

+

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.

+

Topologies

+

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.

+ +
+ + + + + + + + + + + +
+ +

3 - Components

+
Workflow is comprised of a number of small, independent services that combine to create a distributed CaaS.
+

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!

+

Controller

+

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.

+

Passport

+

Project Location: drycc/passport

+

The passport component exposes a web API and provide OAuth2 authentication.

+

Database

+

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.

+

Builder

+

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:

+
    +
  1. Receives incoming git push requests over SSH
  2. +
  3. Authenticates the user via SSH key fingerprint
  4. +
  5. Authorizes the user’s access to push code to the Application
  6. +
  7. Starts the Application Build phase (see below)
  8. +
  9. Triggers a new Release via the Controller
  10. +
+

Builder 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.

+

Object Storage

+

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.

+

Registry

+

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.

+

Logger: fluentbit, logger

+

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.

+

Monitor

+

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.

+

Prometheus

+

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.

+

Rabbitmq

+

Project Location: drycc/rabbitmq

+

RabbitMQ is the most widely deployed open source message broker. +Controller use celery with rabbitMQ to execute the asynchronous task.

+

HelmBroker

+

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.

+

Prometheus

+

Project Location: drycc/rabbitmq

+

Prometheus is an open-source systemsmonitoring and alerting toolkit originally built atSoundCloud.

+

See Also

+ + +
+ + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/docs/understanding-workflow/architecture/index.html b/docs/understanding-workflow/architecture/index.html new file mode 100644 index 000000000..93078244b --- /dev/null +++ b/docs/understanding-workflow/architecture/index.html @@ -0,0 +1,506 @@ + + + + + + + + + + + + + + + + + + + +Architecture | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Architecture

+
Drycc Workflow is built using a service oriented architecture.
+ +

All components are published as a set of container images which can be deployed to any +compliant Kubernetes cluster.

+

Overview

+

System Overview

+

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.

+

Platform Services

+

Workflow Overview

+

Drycc Workflow provides additional functionality to your Kubernetes cluster, including:

+ +

Kubernetes-Native

+

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.

+

Workflow and Kubernetes

+

Application Layout and Edge Routing

+

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.

+

Application Configuration

+

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.

+

Topologies

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/understanding-workflow/components/index.html b/docs/understanding-workflow/components/index.html new file mode 100644 index 000000000..3cd0f06b4 --- /dev/null +++ b/docs/understanding-workflow/components/index.html @@ -0,0 +1,576 @@ + + + + + + + + + + + + + + + + + + + +Components | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Components

+
Workflow is comprised of a number of small, independent services that combine to create a distributed CaaS.
+ +

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!

+

Controller

+

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.

+

Passport

+

Project Location: drycc/passport

+

The passport component exposes a web API and provide OAuth2 authentication.

+

Database

+

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.

+

Builder

+

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:

+
    +
  1. Receives incoming git push requests over SSH
  2. +
  3. Authenticates the user via SSH key fingerprint
  4. +
  5. Authorizes the user’s access to push code to the Application
  6. +
  7. Starts the Application Build phase (see below)
  8. +
  9. Triggers a new Release via the Controller
  10. +
+

Builder 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.

+

Object Storage

+

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.

+

Registry

+

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.

+

Logger: fluentbit, logger

+

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.

+

Monitor

+

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.

+

Prometheus

+

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.

+

Rabbitmq

+

Project Location: drycc/rabbitmq

+

RabbitMQ is the most widely deployed open source message broker. +Controller use celery with rabbitMQ to execute the asynchronous task.

+

HelmBroker

+

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.

+

Prometheus

+

Project Location: drycc/rabbitmq

+

Prometheus is an open-source systemsmonitoring and alerting toolkit originally built atSoundCloud.

+

See Also

+ + + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/understanding-workflow/concepts/index.html b/docs/understanding-workflow/concepts/index.html new file mode 100644 index 000000000..d8fa7f179 --- /dev/null +++ b/docs/understanding-workflow/concepts/index.html @@ -0,0 +1,556 @@ + + + + + + + + + + + + + + + + + + + +Concepts | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Concepts

+
Drycc Workflow is a lightweight application platform that deploys and scales Twelve-Factor apps as containers across a Kubernetes cluster.
+ +

Twelve-Factor Applications

+

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

+

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

+

[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.

+

Applications

+

Workflow is designed around the concept of an application, or app.

+

Applications come in one of three forms:

+
    +
  1. a collection of source files stored in a git repository
  2. +
  3. a Dockerfile and associated source files stored in a git repository
  4. +
  5. a reference to an existing image at a Container repository
  6. +
+

Applications 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.

+

Build, Release, Run

+

Git Push Workflow

+

Build Stage

+

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.

+

Release Stage

+

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.

+

Run Stage

+

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.

+

Backing Services

+

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.

+

See Also

+ + + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/understanding-workflow/index.html b/docs/understanding-workflow/index.html new file mode 100644 index 000000000..87748bf05 --- /dev/null +++ b/docs/understanding-workflow/index.html @@ -0,0 +1,472 @@ + + + + + + + + + + + + + + + + + + + + + +Understanding Workflow | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Understanding Workflow

+
Understanding the architecture design of workflow.
+ + +
+ + +
+
+
+ Concepts +
+

Drycc Workflow is a lightweight application platform that deploys and scales Twelve-Factor apps as containers across a Kubernetes cluster.

+
+
+
+ Architecture +
+

Drycc Workflow is built using a service oriented architecture.

+
+
+
+ Components +
+

Workflow is comprised of a number of small, independent services that combine to create a distributed CaaS.

+
+
+ +
+ + + + + + +
+ +
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/understanding-workflow/index.xml b/docs/understanding-workflow/index.xml new file mode 100644 index 000000000..8fef5c8b8 --- /dev/null +++ b/docs/understanding-workflow/index.xml @@ -0,0 +1,290 @@ + + + Drycc – Understanding Workflow + /docs/understanding-workflow/ + Recent content in Understanding Workflow on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Docs: Concepts + /docs/understanding-workflow/concepts/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/understanding-workflow/concepts/ + + + + <h2 id="twelve-factor-applications">Twelve-Factor Applications<a class="td-heading-self-link" href="#twelve-factor-applications" aria-label="Heading self-link"></a></h2> +<p>The <a href="http://12factor.net/">Twelve-Factor App</a> is a methodology for building modern +applications that can be scaled across a distributed system.</p> +<p>Twelve-factor is a valuable synthesis of years of experience with +software-as-a-service apps in the wild, particularly on the +Heroku platform.</p> +<p>Workflow is designed to run applications that adhere to the <a href="http://12factor.net/">Twelve-Factor App</a> +methodology and best practices.</p> +<h2 id="kubernetes">Kubernetes<a class="td-heading-self-link" href="#kubernetes" aria-label="Heading self-link"></a></h2> +<p><a href="https://kubernetes.io">Kubernetes</a> is an open-source cluster manager developed by Google and +donated to the <a href="https://cncf.io/">Cloud Native Compute Foundation</a>. Kubernetes manages all +the activity on your cluster, including: desired state convergence, stable +service addresses, health monitoring, service discovery, and DNS resolution.</p> +<p>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.</p> +<p>Drycc Workflow is a set of Kubernetes-native components, installable via +<a href="https://github.com/kubernetes/helm">Helm</a>. Systems engineers who are familiar with Kubernetes will feel right +at home running Workflow.</p> +<p>See the <a href="/docs/understanding-workflow/components/">components</a> overview for more detail.</p> +<h2 id="container">Container<a class="td-heading-self-link" href="#container" aria-label="Heading self-link"></a></h2> +<p>[Container][] is an open source project to build, ship and run any +application as a lightweight, portable, self-sufficient container.</p> +<p>If you have not yet converted your application to containers, Workflow provides +a simple and straightforward &ldquo;source to Container image&rdquo; capability. Supporting +multiple language runtimes via community <a href="/docs/applications/using-buildpacks/">buildpacks</a>, building your application +in a container can be as easy as <code>git push drycc master</code>.</p> +<p>Applications which use either a Dockerfile or reference external Container +images are launched unmodified.</p> +<h2 id="applications">Applications<a class="td-heading-self-link" href="#applications" aria-label="Heading self-link"></a></h2> +<p>Workflow is designed around the concept of an <a href="../reference-guide/terms.md#application">application</a>, or app.</p> +<p>Applications come in one of three forms:</p> +<ol> +<li>a collection of source files stored in a <code>git</code> repository</li> +<li>a Dockerfile and associated source files stored in a <code>git</code> repository</li> +<li>a reference to an existing image at a Container repository</li> +</ol> +<p>Applications 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.</p> +<h2 id="build-release-run">Build, Release, Run<a class="td-heading-self-link" href="#build-release-run" aria-label="Heading self-link"></a></h2> +<p><img alt="Git Push Workflow" src="../../diagrams/Git_Push_Flow.png"></p> +<h3 id="build-stage">Build Stage<a class="td-heading-self-link" href="#build-stage" aria-label="Heading self-link"></a></h3> +<p>The <a href="/docs/understanding-workflow/components/#builder">builder</a> component processes incoming <code>git push drycc master</code> requests +and manages your application packaging.</p> +<p>If your application is using a <a href="/docs/applications/using-buildpacks/">buildpack</a>, 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.</p> +<p>If instead builder finds a <a href="/docs/applications/using-dockerfiles/">Dockerfile</a>, 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.</p> +<p>If another system already builds and packages your application, that container +artifact can be used directly. When referencing an <a href="/docs/applications/using-container-images/">external Container +image</a>, the builder component doesn&rsquo;t attempt to repackage your +app.</p> +<h3 id="release-stage">Release Stage<a class="td-heading-self-link" href="#release-stage" aria-label="Heading self-link"></a></h3> +<p>During the release stage, a <a href="../reference-guide/terms.md#build">build</a> is combined with <a href="../reference-guide/terms.md#config">application configuration</a> +to create a new, numbered <a href="../reference-guide/terms.md#release">release</a>. New releases are created any time a new +build is created or application configuration is changed. Tracking releases as a +&ldquo;write-only ledger&rdquo; this way makes it easy to rollback to any previous release.</p> +<h3 id="run-stage">Run Stage<a class="td-heading-self-link" href="#run-stage" aria-label="Heading self-link"></a></h3> +<p>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.</p> +<h2 id="backing-services">Backing Services<a class="td-heading-self-link" href="#backing-services" aria-label="Heading self-link"></a></h2> +<p>Workflow treats all persistent services such as databases, caches, storage, +messaging systems, and other <a href="http://12factor.net/backing-services">backing services</a> as resources managed +separately from your application. This philosophy aligns with Twelve-Factor +best practices.</p> +<p>Applications attach to backing services using <a href="http://12factor.net/config">environment variables</a>. +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.</p> +<h2 id="see-also">See Also<a class="td-heading-self-link" href="#see-also" aria-label="Heading self-link"></a></h2> +<ul> +<li><a href="/docs/understanding-workflow/architecture/">Workflow Architecture</a></li> +<li><a href="/docs/understanding-workflow/components/">Workflow Components</a></li> +</ul> + + + + + + Docs: Architecture + /docs/understanding-workflow/architecture/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/understanding-workflow/architecture/ + + + + <p>All components are published as a set of container images which can be deployed to any +compliant Kubernetes cluster.</p> +<h2 id="overview">Overview<a class="td-heading-self-link" href="#overview" aria-label="Heading self-link"></a></h2> +<p><img alt="System Overview" src="../../diagrams/Ecosystem_Basic.jpg"></p> +<p>Operators use <a href="https://github.com/kubernetes/helm">Helm</a> 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.</p> +<h2 id="platform-services">Platform Services<a class="td-heading-self-link" href="#platform-services" aria-label="Heading self-link"></a></h2> +<p><img alt="Workflow Overview" src="../../diagrams/Workflow_Overview.jpg"></p> +<p>Drycc Workflow provides additional functionality to your Kubernetes cluster, including:</p> +<ul> +<li><a href="/docs/understanding-workflow/components/#builder">Source to Image Builder</a> which compiles your Application code via Buildpacks or Dockerfiles</li> +<li><a href="/docs/understanding-workflow/components/#logger">Cross-Pod Log Aggregation</a> which gathers logs from all of your Application processes</li> +<li><a href="/docs/understanding-workflow/components/#controller">Simple REST API</a> which powers the CLI and any external integrations</li> +<li>Application release and rollback</li> +<li>Authentication and Authorization to Application resources</li> +<li><a href="/docs/understanding-workflow/components/#router">HTTP/HTTPS edge routing</a> for your Applications</li> +</ul> +<h2 id="kubernetes-native">Kubernetes-Native<a class="td-heading-self-link" href="#kubernetes-native" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p><img alt="Workflow and Kubernetes" src="../../diagrams/Workflow_Detail.png"></p> +<h2 id="application-layout-and-edge-routing">Application Layout and Edge Routing<a class="td-heading-self-link" href="#application-layout-and-edge-routing" aria-label="Heading self-link"></a></h2> +<p>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.</p> +<p><img alt="Application Configuration" src="../../diagrams/Application_Layout.png"></p> +<p>The router component is responsible for routing HTTP/s traffic to your +Applications as well as proxying <code>git push</code> and platform API traffic.</p> +<p>By default, the router component is deployed as a Kubernetes service with type +<code>LoadBalancer</code>; which, depending on your configuration, will provision a +cloud-native load balancer automatically.</p> +<p>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.</p> +<h2 id="topologies">Topologies<a class="td-heading-self-link" href="#topologies" aria-label="Heading self-link"></a></h2> +<p>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.</p> + + + + + + Docs: Components + /docs/understanding-workflow/components/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/understanding-workflow/components/ + + + + <p>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 <a href="/docs/understanding-workflow/architecture/">Workflow architecture</a>.</p> +<p>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!</p> +<h2 id="controller">Controller<a class="td-heading-self-link" href="#controller" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/controller">drycc/controller</a></p> +<p>The controller component is an HTTP API server which serves as the endpoint for +the <code>drycc</code> 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.</p> +<h2 id="passport">Passport<a class="td-heading-self-link" href="#passport" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/passport">drycc/passport</a></p> +<p>The passport component exposes a web API and provide OAuth2 authentication.</p> +<h2 id="database">Database<a class="td-heading-self-link" href="#database" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/postgres">drycc/postgres</a></p> +<p>The database component is a managed instance of <a href="http://www.postgresql.org/">PostgreSQL</a> which holds a +majority of the platforms state. Backups and WAL files are pushed to object +storage via <a href="https://github.com/wal-e/wal-e">WAL-E</a>. When the database is restarted, backups are fetched and +replayed from object storage so no data is lost.</p> +<h2 id="builder">Builder<a class="td-heading-self-link" href="#builder" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/builder">drycc/builder</a></p> +<p>The builder component is responsible for accepting code pushes via <a href="http://git-scm.com/">Git</a> and +managing the build process of your <a href="../reference-guide/terms.md#application">Application</a>. The builder process is:</p> +<ol> +<li>Receives incoming <code>git push</code> requests over SSH</li> +<li>Authenticates the user via SSH key fingerprint</li> +<li>Authorizes the user&rsquo;s access to push code to the Application</li> +<li>Starts the Application Build phase (see below)</li> +<li>Triggers a new <a href="../reference-guide/terms.md#release">Release</a> via the Controller</li> +</ol> +<p>Builder currently supports both buildpack and Dockerfile based builds.</p> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/imagebuilder">drycc/imagebuilder</a></p> +<p>For Buildpack-based deploys, the builder component will launch a one-shot Job +in the <code>drycc</code> namespace. This job runs <code>imagebuilder</code> component which handles +default and custom buildpacks (specified by <code>.packbuilder</code>). The completed image +is pushed to the managed Container registry on cluster. For more information +about buildpacks see <a href="/docs/applications/using-buildpacks/">using buildpacks</a>.</p> +<p>Unlike buildpack-based, For Applications which contain a <code>Dockerfile</code> in the root +of the repository, it generates a Container image (using the underlying Container engine). +For more information see <a href="/docs/applications/using-dockerfiles/">using Dockerfiles</a>.</p> +<h2 id="object-storage">Object Storage<a class="td-heading-self-link" href="#object-storage" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/storage">drycc/storage</a></p> +<p>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.</p> +<p>Workflow supports either on or off-cluster storage. For production deployments +we highly recommend that you configure <a href="/docs/installing-workflow/configuring-object-storage/">off-cluster object storage</a>.</p> +<p>To facilitate experimentation, development and test environments, the default charts for +Workflow include on-cluster storage via <a href="https://github.com/drycc/storage">storage</a>.</p> +<p>If you also feel comfortable using Kubernetes persistent volumes you may +configure storage to use persistent storage available in your environment.</p> +<h2 id="registry">Registry<a class="td-heading-self-link" href="#registry" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/registry">drycc/registry</a></p> +<p>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.</p> +<h2 id="logger-fluentbit-logger">Logger: fluentbit, logger<a class="td-heading-self-link" href="#logger-fluentbit-logger" aria-label="Heading self-link"></a></h2> +<p>The logging subsystem consists of two components. Fluentbit handles log shipping +and logger maintains a ring-buffer of application logs.</p> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/fluentbit">drycc/fluentbit</a></p> +<p>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 <code>drycc logs</code>.</p> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/logger">drycc/logger</a></p> +<p>The <code>logger</code> component receives log streams from <code>fluentbit</code>, 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 <a href="https://github.com/drycc/logger">project +documentation</a>.</p> +<h2 id="monitor">Monitor<a class="td-heading-self-link" href="#monitor" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/monitor">drycc/monitor</a></p> +<p>The monitoring subsystem consists of two components: Telegraf and Grafana.</p> +<p>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.</p> +<p>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&rsquo;s needs.</p> +<h2 id="prometheus">Prometheus<a class="td-heading-self-link" href="#prometheus" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/prometheus">drycc/prometheus</a></p> +<p>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.</p> +<h2 id="rabbitmq">Rabbitmq<a class="td-heading-self-link" href="#rabbitmq" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/rabbitmq">drycc/rabbitmq</a></p> +<p>RabbitMQ is the most widely deployed open source message broker. +Controller use celery with rabbitMQ to execute the asynchronous task.</p> +<h2 id="helmbroker">HelmBroker<a class="td-heading-self-link" href="#helmbroker" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/helmbroker">drycc/rabbitmq</a></p> +<p>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.</p> +<h2 id="prometheus-1">Prometheus<a class="td-heading-self-link" href="#prometheus-1" aria-label="Heading self-link"></a></h2> +<p><strong>Project Location:</strong> <a href="https://github.com/drycc/prometheus">drycc/rabbitmq</a></p> +<p>Prometheus is an open-source systemsmonitoring and alerting toolkit originally built atSoundCloud.</p> +<h2 id="see-also">See Also<a class="td-heading-self-link" href="#see-also" aria-label="Heading self-link"></a></h2> +<ul> +<li><a href="/docs/understanding-workflow/concepts/">Workflow Concepts</a></li> +<li><a href="/docs/understanding-workflow/architecture/">Workflow Architecture</a></li> +</ul> + + + + + + diff --git a/docs/users/_print/index.html b/docs/users/_print/index.html new file mode 100644 index 000000000..06eece87a --- /dev/null +++ b/docs/users/_print/index.html @@ -0,0 +1,435 @@ + + + + + + + + + + + + + + + + + + + + + +Users | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+ + + + + +
+
+

+This is the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Users

+
In this tutorial, you’ll learn how to manage users.
+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + +
+ +

1 - Drycc Workflow CLI

+
How to download, install, and start using the Drycc CLI. The Drycc CLI used to be part of the Drycc Toolbelt.
+

The Drycc Workflow command-line interface (CLI), or client, allows you to interact +with Drycc Workflow.

+

Installation

+

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
+
+

Getting Help

+

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
+
+

Support for Multiple Profiles

+

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.

+
    +
  1. Path to a json configuration file.
  2. +
  3. Profile name. If you set profile to just a name, it will be saved alongside the default profile, +in $HOME/.drycc/<name>.json.
  4. +
+

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
+
+

Proxy Support

+

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.

+

CLI Plugins

+

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
+
+ +
+ + + + + + + + + + + +
+ +

2 - Users and Registration

+
Get started on Drycc today
+

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.

+

Login to Workflow

+

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 from Workflow

+

Logout of an existing controller session using drycc logout.

+
$ drycc logout
+Logged out as drycc
+
+

Verify Your Session

+

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.

+ +
+ + + + + + + + + + + +
+ +

3 - Users and SSH Keys

+
Create, manage, and upload SSH keys to Drycc for use in deploying and connecting to applications.
+

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.

+

Generate an SSH Key

+

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)
+

Adding and Removing SSH Keys

+

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
+
+
+ + + + + + + + + +
+
+
+ + +
+ + + + + + diff --git a/docs/users/cli/index.html b/docs/users/cli/index.html new file mode 100644 index 000000000..c91b34bf2 --- /dev/null +++ b/docs/users/cli/index.html @@ -0,0 +1,555 @@ + + + + + + + + + + + + + + + + + + + +Drycc Workflow CLI | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Drycc Workflow CLI

+
How to download, install, and start using the Drycc CLI. The Drycc CLI used to be part of the Drycc Toolbelt.
+ +

The Drycc Workflow command-line interface (CLI), or client, allows you to interact +with Drycc Workflow.

+

Installation

+

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
+
+

Getting Help

+

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
+
+

Support for Multiple Profiles

+

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.

+
    +
  1. Path to a json configuration file.
  2. +
  3. Profile name. If you set profile to just a name, it will be saved alongside the default profile, +in $HOME/.drycc/<name>.json.
  4. +
+

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
+
+

Proxy Support

+

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.

+

CLI Plugins

+

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
+
+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/users/index.html b/docs/users/index.html new file mode 100644 index 000000000..adf2eb30d --- /dev/null +++ b/docs/users/index.html @@ -0,0 +1,472 @@ + + + + + + + + + + + + + + + + + + + + + +Users | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Users

+
In this tutorial, you’ll learn how to manage users.
+ + +
+ + +
+
+
+ Drycc Workflow CLI +
+

How to download, install, and start using the Drycc CLI. The Drycc CLI used to be part of the Drycc Toolbelt.

+
+
+
+ Users and Registration +
+

Get started on Drycc today

+
+
+
+ Users and SSH Keys +
+

Create, manage, and upload SSH keys to Drycc for use in deploying and connecting to applications.

+
+
+ +
+ + + + + + +
+ +
+ +
+ +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/users/index.xml b/docs/users/index.xml new file mode 100644 index 000000000..c43396601 --- /dev/null +++ b/docs/users/index.xml @@ -0,0 +1,212 @@ + + + Drycc – Users + /docs/users/ + Recent content in Users on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + Docs: Drycc Workflow CLI + /docs/users/cli/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/users/cli/ + + + + <p>The Drycc Workflow command-line interface (CLI), or client, allows you to interact +with Drycc Workflow.</p> +<h2 id="installation">Installation<a class="td-heading-self-link" href="#installation" aria-label="Heading self-link"></a></h2> +<p>Install the latest <code>drycc</code> client for Linux or Mac OS X with: +$ curl -sfL <a href="https://www.drycc.cc/install-cli.sh">https://www.drycc.cc/install-cli.sh</a> | bash -</p> +<p>The installer puts <code>drycc</code> in your current directory, but you should move it +somewhere in your $PATH:</p> +<pre><code>$ ln -fs $PWD/drycc /usr/local/bin/drycc +</code></pre> +<h2 id="getting-help">Getting Help<a class="td-heading-self-link" href="#getting-help" aria-label="Heading self-link"></a></h2> +<p>The Drycc client comes with comprehensive documentation for every command. +Use <code>drycc help</code> to explore the commands available to you:</p> +<pre><code>$ drycc help +The Drycc command-line client issues API calls to a Drycc controller. + +Usage: drycc &lt;command&gt; [&lt;args&gt;...] + +Auth commands:: + + login login to a controller + logout logout from the current controller + +Subcommands, use `drycc help [subcommand]` to learn more:: +... +</code></pre> +<p>To get help on subcommands, use <code>drycc help [subcommand]</code>:</p> +<pre><code>$ 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 +</code></pre> +<h2 id="support-for-multiple-profiles">Support for Multiple Profiles<a class="td-heading-self-link" href="#support-for-multiple-profiles" aria-label="Heading self-link"></a></h2> +<p>The CLI reads from the default <code>client</code> profile, which is located on your +workstation at <code>$HOME/.drycc/client.json</code>.</p> +<p>Easily switch between multiple Drycc Workflow installations or users by setting +the <code>$DRYCC_PROFILE</code> environment variable or by using the <code>-c</code> flag.</p> +<p>There are two ways to set the <code>$DRYCC_PROFILE</code> option.</p> +<ol> +<li>Path to a json configuration file.</li> +<li>Profile name. If you set profile to just a name, it will be saved alongside the default profile, +in <code>$HOME/.drycc/&lt;name&gt;.json</code>.</li> +</ol> +<p>Examples:</p> +<pre><code>$ 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 +</code></pre> +<p>The configuration flag works identically to and overrides <code>$DRYCC_PROFILE</code>:</p> +<pre><code>$ drycc whoami -c ~/config.json +You are drycc at drycc.example.com +</code></pre> +<h2 id="proxy-support">Proxy Support<a class="td-heading-self-link" href="#proxy-support" aria-label="Heading self-link"></a></h2> +<p>If your workstation uses a proxy to reach the network where the cluster lies, +set the <code>http_proxy</code> or <code>https_proxy</code> environment variable to enable proxy support:</p> +<pre><code>$ export http_proxy=&quot;http://proxyip:port&quot; +$ export https_proxy=&quot;http://proxyip:port&quot; +</code></pre> +<p>!!! note +Configuring a proxy is generally not necessary for local Minikube clusters.</p> +<h2 id="cli-plugins">CLI Plugins<a class="td-heading-self-link" href="#cli-plugins" aria-label="Heading self-link"></a></h2> +<p>Plugins allow developers to extend the functionality of the Drycc Client, adding new commands or features.</p> +<p>If an unknown command is specified, the client will attempt to execute the command as a dash-separated command. In this case, <code>drycc resource:command</code> will execute <code>drycc-resource</code> with the argument list <code>command</code>. In full form:</p> +<pre><code>$ # these two are identical +$ drycc accounts:list +$ drycc-accounts list +</code></pre> +<p>Any flags after the command will also be sent to the plugin as an argument:</p> +<pre><code>$ # these two are identical +$ drycc accounts:list --debug +$ drycc-accounts list --debug +</code></pre> +<p>But flags preceding the command will not:</p> +<pre><code>$ # these two are identical +$ drycc --debug accounts:list +$ drycc-accounts list +</code></pre> + + + + + + Docs: Users and Registration + /docs/users/registration/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/users/registration/ + + + + <p>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.</p> +<h2 id="login-to-workflow">Login to Workflow<a class="td-heading-self-link" href="#login-to-workflow" aria-label="Heading self-link"></a></h2> +<p>If you already have an account, use <code>drycc login</code> to authenticate against the Drycc Workflow API.</p> +<pre><code>$ 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 +</code></pre> +<p>Or you can login with username and password +$ drycc login <a href="http://drycc.example.com">http://drycc.example.com</a> &ndash;username=demo &ndash;password=demo +Configuration file written to /root/.drycc/client.json</p> +<h2 id="logout-from-workflow">Logout from Workflow<a class="td-heading-self-link" href="#logout-from-workflow" aria-label="Heading self-link"></a></h2> +<p>Logout of an existing controller session using <code>drycc logout</code>.</p> +<pre><code>$ drycc logout +Logged out as drycc +</code></pre> +<h2 id="verify-your-session">Verify Your Session<a class="td-heading-self-link" href="#verify-your-session" aria-label="Heading self-link"></a></h2> +<p>You can verify your client configuration by running <code>drycc whoami</code>.</p> +<pre><code>$ drycc whoami +You are drycc at http://drycc.example.com +</code></pre> +<p>!!! note +Session and client configuration is stored in the <code>~/.drycc/client.json</code> file.</p> + + + + + + Docs: Users and SSH Keys + /docs/users/ssh-keys/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/users/ssh-keys/ + + + + <p>For <strong>Dockerfile</strong> and <strong>Buildpack</strong> based application deploys via <code>git push</code>, 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.</p> +<h2 id="generate-an-ssh-key">Generate an SSH Key<a class="td-heading-self-link" href="#generate-an-ssh-key" aria-label="Heading self-link"></a></h2> +<p>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 +<code>ssh-keygen</code>:</p> +<pre tabindex="0"><code>$ 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&#39;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) +</code></pre><h2 id="adding-and-removing-ssh-keys">Adding and Removing SSH Keys<a class="td-heading-self-link" href="#adding-and-removing-ssh-keys" aria-label="Heading self-link"></a></h2> +<p>By publishing the <strong>public</strong> half of your SSH key to Drycc Workflow the component responsible for receiving <code>git push</code> +will be able to authenticate the user and ensure that they have access to the destination application.</p> +<pre tabindex="0"><code>$ drycc keys:add ~/.ssh/id_drycc.pub +Uploading id_drycc.pub to drycc... done +</code></pre><p>You can always view the keys associated with your user as well:</p> +<pre tabindex="0"><code>$ 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 +</code></pre><p>Remove keys by their name:</p> +<pre tabindex="0"><code>$ drycc keys:remove admin@plinth-23437.local +Removing admin@plinth-23437.local SSH Key... don +</code></pre> + + + + + diff --git a/docs/users/registration/index.html b/docs/users/registration/index.html new file mode 100644 index 000000000..10f53ffb1 --- /dev/null +++ b/docs/users/registration/index.html @@ -0,0 +1,484 @@ + + + + + + + + + + + + + + + + + + + +Users and Registration | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Users and Registration

+
Get started on Drycc today
+ +

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.

+

Login to Workflow

+

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 from Workflow

+

Logout of an existing controller session using drycc logout.

+
$ drycc logout
+Logged out as drycc
+
+

Verify Your Session

+

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.

+ + +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/docs/users/ssh-keys/index.html b/docs/users/ssh-keys/index.html new file mode 100644 index 000000000..6a33e98e0 --- /dev/null +++ b/docs/users/ssh-keys/index.html @@ -0,0 +1,500 @@ + + + + + + + + + + + + + + + + + + + +Users and SSH Keys | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + +
+ + + + + +
+

Users and SSH Keys

+
Create, manage, and upload SSH keys to Drycc for use in deploying and connecting to applications.
+ +

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.

+

Generate an SSH Key

+

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)
+

Adding and Removing SSH Keys

+

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
+
+ +
+ + + + + + +
+ +
+ + +
+ + +
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/favicons/android-144x144.png b/favicons/android-144x144.png new file mode 100644 index 000000000..8851c09a4 Binary files /dev/null and b/favicons/android-144x144.png differ diff --git a/favicons/android-192x192.png b/favicons/android-192x192.png new file mode 100644 index 000000000..94b2ad2db Binary files /dev/null and b/favicons/android-192x192.png differ diff --git a/favicons/android-36x36.png b/favicons/android-36x36.png new file mode 100644 index 000000000..7ec5cf650 Binary files /dev/null and b/favicons/android-36x36.png differ diff --git a/favicons/android-48x48.png b/favicons/android-48x48.png new file mode 100644 index 000000000..419a445ad Binary files /dev/null and b/favicons/android-48x48.png differ diff --git a/favicons/android-72x72.png b/favicons/android-72x72.png new file mode 100644 index 000000000..230b18fd5 Binary files /dev/null and b/favicons/android-72x72.png differ diff --git a/favicons/android-96x96.png b/favicons/android-96x96.png new file mode 100644 index 000000000..8cc698973 Binary files /dev/null and b/favicons/android-96x96.png differ diff --git a/favicons/apple-touch-icon-180x180.png b/favicons/apple-touch-icon-180x180.png new file mode 100644 index 000000000..03d0b5134 Binary files /dev/null and b/favicons/apple-touch-icon-180x180.png differ diff --git a/favicons/favicon-1024.png b/favicons/favicon-1024.png new file mode 100644 index 000000000..920f10720 Binary files /dev/null and b/favicons/favicon-1024.png differ diff --git a/favicons/favicon-16x16.png b/favicons/favicon-16x16.png new file mode 100644 index 000000000..ce918ee3a Binary files /dev/null and b/favicons/favicon-16x16.png differ diff --git a/favicons/favicon-256.png b/favicons/favicon-256.png new file mode 100644 index 000000000..ebd3f8c98 Binary files /dev/null and b/favicons/favicon-256.png differ diff --git a/favicons/favicon-32x32.png b/favicons/favicon-32x32.png new file mode 100644 index 000000000..e95c80ad6 Binary files /dev/null and b/favicons/favicon-32x32.png differ diff --git a/favicons/favicon.ico b/favicons/favicon.ico new file mode 100644 index 000000000..216330ff2 Binary files /dev/null and b/favicons/favicon.ico differ diff --git a/favicons/pwa-192x192.png b/favicons/pwa-192x192.png new file mode 100644 index 000000000..94b2ad2db Binary files /dev/null and b/favicons/pwa-192x192.png differ diff --git a/favicons/pwa-512x512.png b/favicons/pwa-512x512.png new file mode 100644 index 000000000..89258a4e6 Binary files /dev/null and b/favicons/pwa-512x512.png differ diff --git a/favicons/tile150x150.png b/favicons/tile150x150.png new file mode 100644 index 000000000..3d0c7604e Binary files /dev/null and b/favicons/tile150x150.png differ diff --git a/favicons/tile310x150.png b/favicons/tile310x150.png new file mode 100644 index 000000000..ed8904286 Binary files /dev/null and b/favicons/tile310x150.png differ diff --git a/favicons/tile310x310.png b/favicons/tile310x310.png new file mode 100644 index 000000000..67172b306 Binary files /dev/null and b/favicons/tile310x310.png differ diff --git a/favicons/tile70x70.png b/favicons/tile70x70.png new file mode 100644 index 000000000..31413a2be Binary files /dev/null and b/favicons/tile70x70.png differ diff --git a/featured-background.svg b/featured-background.svg new file mode 100644 index 000000000..d68e32cdd --- /dev/null +++ b/featured-background.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/index.html b/index.html new file mode 100644 index 000000000..24a7f7719 --- /dev/null +++ b/index.html @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + +Drycc + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + + + +
+
+
+
+

A Open, Unified, Lightweight, Simpler Containers as a Service (CaaS).

+ +
+ + + Learn More + + + Quickstart + +

Simpler cloud, happier devs, better results — in the drycc!

+

+ +
+
+
+
+ +
+ +
+
+
+
+
+

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)

+
+
+
+
+
+
+
+
+
+
+ +
+

New monitor metrics!

+
+

We provide a few out of the box dashboards for monitoring Drycc Workflow.

+
+

Read more

+
+
+
+ +
+

Contributions welcome!

+
+

We do a Pull Request contributions workflow on GitHub. New users are always welcome!

+
+

Read more

+
+
+
+ +
+

Contact us on tawk!

+
+

If you have any questions concerning our products, our support team will be happy to help you.

+
+

Read more

+
+
+
+
+
+
+
+
+

Features

+
+
+
+
+
+
+
+
+
+ +
+

Open Source

+
+

Open source from day one, leverage the power of global innovation with the leading database open source community.

+
+

Read more

+
+
+
+ +
+

Multi Platform

+
+

Both X86 and ARM64 are supported with binaries and multiarch images available for both, drycc works great from something in any server.

+
+
+
+
+ +
+

Meet twelve-factor

+
+

Drycc Workflow is a lightweight CaaS platform that deploys and scales Twelve-Factor apps as containers across a K8s cluster.

+
+

Read more

+
+
+
+
+
+
+
+
+

It’s easy to deploy, operate and scale drycc — anywhere.

+
+
+
+ + + +
+ + +
+ + + + + + \ No newline at end of file diff --git a/index.xml b/index.xml new file mode 100644 index 000000000..56de50ecd --- /dev/null +++ b/index.xml @@ -0,0 +1,1817 @@ + + + Drycc – Drycc + / + Recent content on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + Blog: Drycc Workflow v1.7.8 + /blog/2024/05/01/drycc-workflow-v1.7.8/ + Wed, 01 May 2024 00:00:00 +0000 + + /blog/2024/05/01/drycc-workflow-v1.7.8/ + + + + <h2 id="workflow--v177---v178">Workflow ## v1.7.7 -&gt; v1.7.8<a class="td-heading-self-link" href="#workflow--v177---v178" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.6.0 -&gt; v1.7.0</li> +<li>controller v1.8.0 -&gt; v1.9.0</li> +<li>workflow-cli v1.6.0 -&gt; v1.7.0</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/384c7ee9c69201b4d3280bb1582e50ad40210b8f"><code>384c7ee</code></a> (builder) - domain: add procfile_type</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/26c8c7f1a2ed3445fc4a52a5f7b8e7cace8a12e8"><code>26c8c7f</code></a> (controller) - domain: add procfile_type</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/bd49789b2aa8bbb8da440d63c83e339fd69d4774"><code>bd49789</code></a> (workflow-cli) - domain: add procfile_type</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.7 + /blog/2024/04/30/drycc-workflow-v1.7.7/ + Tue, 30 Apr 2024 00:00:00 +0000 + + /blog/2024/04/30/drycc-workflow-v1.7.7/ + + + + <h2 id="workflow--v176---v177">Workflow ## v1.7.6 -&gt; v1.7.7<a class="td-heading-self-link" href="#workflow--v176---v177" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.5.1 -&gt; v1.6.0</li> +<li>controller v1.7.0 -&gt; v1.8.0</li> +<li>database v1.2.1 -&gt; v1.3.0</li> +<li>passport v1.2.0 -&gt; v1.3.0</li> +<li>imagebuilder v1.1.1 -&gt; v1.2.0</li> +<li>fluentbit v0.0.1 -&gt; v0.0.2</li> +<li>logger v1.3.3 -&gt; v1.3.4</li> +<li>storage v0.0.5 -&gt; v0.1.0</li> +<li>gateway v0.0.2 -&gt; v0.0.3</li> +<li>monitor v1.4.0 -&gt; v1.4.1</li> +<li>redis v1.3.2 -&gt; v1.4.0</li> +<li>timeseries v0.0.2 -&gt; v0.1.0</li> +<li>prometheus v0.1.1 -&gt; v0.1.2</li> +<li>rabbitmq v1.2.1 -&gt; v1.3.0</li> +<li>registry v1.2.2 -&gt; v1.3.0</li> +<li>registry-proxy v1.2.1 -&gt; v1.2.2</li> +<li>workflow-cli v1.5.2 -&gt; v1.6.0</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/6c1cf5e514543737c38384596abffca1ac96af44"><code>6c1cf5e</code></a> (builder) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/65ae63c4d3aaff3354d162718ff07c0509b4e689"><code>65ae63c</code></a> (builder) - pipeline: add dryccfile support</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/bb7b11de75226c3a1cb9254dfec78a8edda0c864"><code>bb7b11d</code></a> (builder) - auth: add tokens api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/39d022fe0a4106c91ea461f73728490560f8d653"><code>39d022f</code></a> (controller) - ps: add pod logs support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/86056d06d8992172fe02240d7963aa416ec9c754"><code>86056d0</code></a> (controller) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4cf005c1cc4b361af80ef96597e291ebe3baec24"><code>4cf005c</code></a> (controller) - limits: add limits plan support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bf60e4bdbebb3f3288e0fbd81566c264dd187faf"><code>bf60e4b</code></a> (controller) - controller: add init job</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/98f77a8ceeea6e8a098cd37d79115201c40133e1"><code>98f77a8</code></a> (controller) - pipeline: add dryccfile support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8ce9a83f4bcf46d6039910e052e6ebfa959fd0e8"><code>8ce9a83</code></a> (controller) - cert-manager: add tls events</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7034f5d8347f0c85b40651eaf239a554fd95ae76"><code>7034f5d</code></a> (controller) - config: deploy according to procfile_type</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5554d8f9f26790783d97d6d6128920ffa9b28713"><code>5554d8f</code></a> (controller) - config: add typed_values</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2c5bbad2d74b1c40c61158477aac9103dac2eff4"><code>2c5bbad</code></a> (controller) - auth: add token api</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/410d34e8e639c973557104c3aee14a85324f3c0f"><code>410d34e</code></a> (database) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/693e4d199b18342e33c7ec68c3a651d29b7d9ad6"><code>693e4d1</code></a> (imagebuilder) - pipeline: add dryccfile support</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/7d9cc0679eac7dd873d8db8f9607e347830b2aa1"><code>7d9cc06</code></a> (imagebuilder) - config: add typed values</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/854e1711180de70bc83d3c65721910df013ef988"><code>854e171</code></a> (passport) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/7ac92557670d915c1e568c7297c5ec1b9620f1a1"><code>7ac9255</code></a> (passport) - oauth2: add authorization code for any grant type</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/4517547e21983dd7192ae8cc985c974ed2c64b51"><code>4517547</code></a> (rabbitmq) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/bccfcb43cd63e62974b55523a75fa994ed560453"><code>bccfcb4</code></a> (redis) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/d8876055c0732c470d17d9205a5188289fdac1ec"><code>d887605</code></a> (registry) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/ff09e5b8279cd3343370bfa58c3acba234621263"><code>ff09e5b</code></a> (storage) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/c6e2ac82c8adc75687dbc814cb2163b06820311e"><code>c6e2ac8</code></a> (timeseries) - charts: reuses the value from an existing secret and config</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/22c4c772e3c9cbfe4f686d2fbe161b6484cdcc12"><code>22c4c77</code></a> (workflow-cli) - apps: change drycc run to async</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/a9e6369153255a6cc84dc73e3095086a34d25ad1"><code>a9e6369</code></a> (workflow-cli) - ps: add pod logs support</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/2bc31c8a2010e147b92827a967238e88dca5b743"><code>2bc31c8</code></a> (workflow-cli) - limits: add limits plan support</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/f40398a555e67a942fbe465d29e1076516941d74"><code>f40398a</code></a> (workflow-cli) - pipeline: add dryccfile support</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/03638ffdaefab5e0c7020f6eb279ddeda99aeded"><code>03638ff</code></a> (workflow-cli) - tls: add tls events</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/91136274d87d2cf9e0d2a1dd313d9b948a5d0a81"><code>9113627</code></a> (workflow-cli) - config: add typed values</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/43ee760c4bc93bc5e5402536a09f05dfd6832b7d"><code>43ee760</code></a> (workflow-cli) - auth: add tokens api</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/50dfe6449cbf50bfcf55421f34f2195cb8d7e26c"><code>50dfe64</code></a> (builder) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ab09b243b8484d8a989327e8e3b41f2a23efa643"><code>ab09b24</code></a> (controller) - healthcheck: delete outdated code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/52019b541aaaca98b2b6692fec1290d1231e21fe"><code>52019b5</code></a> (controller) - services: default PORT change error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f57ae429fa4d9dbd89c7cf81f805fe9127930219"><code>f57ae42</code></a> (controller) - certificate: failed to create certificate</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/30c3f548324dcfa571a86afbed64ba0d38b72e99"><code>30c3f54</code></a> (controller) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/dbba43ae315644e858eb2330d52cbf636a366a07"><code>dbba43a</code></a> (controller) - service: update port error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e0459c5d43a74c2c38aae6ebf3e207ad8cc9f283"><code>e0459c5</code></a> (controller) - copy: use deepcopy replace copy</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2122479685d9ce83c986449e20a041de105a2d49"><code>2122479</code></a> (controller) - charts: failed to call webhook</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/53d99775d66648aca41b88992df4ee203cb8f675"><code>53d9977</code></a> (controller) - signals: config limits handle error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/afda287ead80e94a699b3548c01fdfdbd1a6f5a4"><code>afda287</code></a> (controller) - limits: always set default</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/b350cb89e4c313d776592e9e4706909ee72550b5"><code>b350cb8</code></a> (database) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/b48a42243e602637fb04f14cb74d23e23096e2e2"><code>b48a422</code></a> (fluentbit) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/7cebca2a2589c839efbe49cbec6becde85149a8e"><code>7cebca2</code></a> (gateway) - cert-manager: auto tls error</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/190c19bbac3386e277bd7918be5b7f7ad5a25566"><code>190c19b</code></a> (imagebuilder) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2c6a6f9273a0f5e2c16744f6ac6e77d27a7234a2"><code>2c6a6f9</code></a> (logger) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/10bb98df862bebefcf4142e88c24e8f804e310ba"><code>10bb98d</code></a> (monitor) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f8225dca4c4ceae7bc4d613e77ae4c8ebf71838c"><code>f8225dc</code></a> (passport) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/06db66c072006f79c10404812ad9f0902cfb52b7"><code>06db66c</code></a> (prometheus) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/f4aff727962b6afe99e89283ce14ebe8d571d9ab"><code>f4aff72</code></a> (rabbitmq) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/88c18ff452bdd478f49dd88f6595ea096e430f2d"><code>88c18ff</code></a> (redis) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5dcc19d6d47ea30b799ae10e915ebd948b39fc4c"><code>5dcc19d</code></a> (registry) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/092a9398243f19e41ac14cc5fb4f76473848c585"><code>092a939</code></a> (registry-proxy) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/3597ac918db548f837b3262a033d836690378972"><code>3597ac9</code></a> (storage) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/5a49b35d2197c957e43a98e94d38ac8a8ebd894b"><code>5a49b35</code></a> (timeseries) - woodpecker: CI_SYSTEM_ARCH env removed</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/0c4a48a84b998b8e7f57f09f307930630e8efd74"><code>0c4a48a</code></a> (workflow-cli) - tls: change issuer options</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/06a2511195bc1f2a3145a73269428200914b4694"><code>06a2511</code></a> (workflow-cli) - tls: info error</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2f7617e164707830b52f2ca39c7f634ca53842ed"><code>2f7617e</code></a> (builder) - go: bump controller-sdk-go version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/aae2f2911197e4643e7a999944401d2e5acd884d"><code>aae2f29</code></a> (builder) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7304980fb22cd0d56e1fa5b1e573b4795ef2ddd9"><code>7304980</code></a> (builder) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/30b648b0d429ba08f89e1d3b49078e40eae2d897"><code>30b648b</code></a> (builder) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2afa006867a3d4d4501578f0973ff759d87af87f"><code>2afa006</code></a> (builder) - controller-sdk-go: bump version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d127a9070a6dd0be1d96860c719d3b4a71eb7bb9"><code>d127a90</code></a> (builder) - config: add typed values</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/32fdfd0e7f54793d3ced05ff42b300173debe866"><code>32fdfd0</code></a> (controller) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0974942fb8a70d9165ef6524744850cf72629a0c"><code>0974942</code></a> (controller) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f401e08d3ffbfee5d84410ad8e31c18a3267513e"><code>f401e08</code></a> (controller) - python: bump python 3.12</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c565959af53e6ab7be7245faea09fd1a30972ac7"><code>c565959</code></a> (controller) - celery: remove retrieve_resource task</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/47be1a10b03d7522a9bc87b9973c8f126db95478"><code>47be1a1</code></a> (controller) - requirements: bump drf 3.15.1</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/99f7468e561d596121bc981294e6ca4baaed2728"><code>99f7468</code></a> (controller) - charts: add config to values.yaml</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7d17f5ca716596ef66046eb5f3606215feb87731"><code>7d17f5c</code></a> (controller) - scale: prohibit scale when there is a running pipeline</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f09e1c9475e64840ff02e23cee30f5911b507a58"><code>f09e1c9</code></a> (controller) - resource: sort services and plans</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e817505fc5dc6a2e9b959b9fd7d63c044f17fcf1"><code>e817505</code></a> (controller) - limits: change default cpu and gpu name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5531b2ff4b15a6b9804cc0b146b69ee7308a1a83"><code>5531b2f</code></a> (controller) - auth: add password login</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/27473f72e8b7c1f1b6bb9c56493688f346bbcc9c"><code>27473f7</code></a> (controller) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c1ee1c7a3103c938b8b81219da7b14cd30f3eceb"><code>c1ee1c7</code></a> (controller) - deps: bump aiohttp from 3.9.3 to 3.9.4 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/affbcb587360d7750f3faf4d022e36032f0b3266"><code>affbcb5</code></a> (database) - postgres: add patroni and postgres params (#15)</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/f9e4edaf9a2a22b974a2aced48a7890f767da0c0"><code>f9e4eda</code></a> (database) - dockerfile: install vi</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/008b7b675c244d2aff9b86947fe907dbb84185f4"><code>008b7b6</code></a> (database) - dockerfile: install vim instand of vi</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/dbbfee12b2fe9c773d32660a6bcf26674ae2cd61"><code>dbbfee1</code></a> (database) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/2e26c333df5aa90243cff8c5159a6c3a9b499a00"><code>2e26c33</code></a> (database) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/a1b81f20f517743d9f69ecda526095a4e9c3ee36"><code>a1b81f2</code></a> (database) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/bc725e8169b25eda4017012f72b5d970147f0d08"><code>bc725e8</code></a> (fluentbit) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/5d738865825bd083561972373a5dd8796a53be6c"><code>5d73886</code></a> (fluentbit) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/b85072d0177447ac3f05f1f4ccd4c9d7f4a56f99"><code>b85072d</code></a> (fluentbit) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/761174ddb5bc06643a02c145714587816ea06f8a"><code>761174d</code></a> (gateway) - gateway: change secrets name</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/1c304da25eef99568badf3ece29639dd6d8f8564"><code>1c304da</code></a> (gateway) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/b919a4c24b5abb776876df002cc9d4c15cf3d50d"><code>b919a4c</code></a> (gateway) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/3cea298be74856a2fba40b0a35824e0f3018dcab"><code>3cea298</code></a> (imagebuilder) - charts: allow all dns</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/653bcbeec95adcea209299751a3a94f3ebaf2d4f"><code>653bcbe</code></a> (imagebuilder) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/59daeab055610ce6cc584be73dba3767158b9747"><code>59daeab</code></a> (imagebuilder) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2834a5acb914eecb7708ad3bd3efdcc38243d784"><code>2834a5a</code></a> (logger) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6685492c2a8493bad3b59dedb201576f7508ff86"><code>6685492</code></a> (logger) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/191cdaf001ab5b916b0edf53aaa2a7558ef7f35a"><code>191cdaf</code></a> (logger) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/b3c3cfa319fe46d30696a2f4637f91636398ffff"><code>b3c3cfa</code></a> (monitor) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/796799db309de06ea54db56a1c0e5f397c858f47"><code>796799d</code></a> (monitor) - grafana: add node metrics dashboard</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/ef2a2228a27e4eddce1ff3b4b56755ab013c47cd"><code>ef2a222</code></a> (monitor) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9c830909640fddca03329d4a72eb91ab1d913c86"><code>9c83090</code></a> (monitor) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/1a97c2cedd3ace5c567bf32dbd057bd215502662"><code>1a97c2c</code></a> (passport) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/353e1ae932ea4dae5112b8f8225ee502695b11ee"><code>353e1ae</code></a> (passport) - logger: add oauth2_provider logger config</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/fe735c0d8c5a2840349b27ceb081d02729ae50bf"><code>fe735c0</code></a> (passport) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/41d6144a20f24461e1a393d4b1957f5be19f4f3a"><code>41d6144</code></a> (passport) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/979d4740bdd50a12f5110144cf413c3972164c90"><code>979d474</code></a> (passport) - python: bump python 3.12</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/e9f41a121e11becd9dcd6b5422dcc6e209cbeedf"><code>e9f41a1</code></a> (passport) - requirements: bump drf 3.15.1</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f479f4d5791ac2917679b70f376ec9bf24fa1fd4"><code>f479f4d</code></a> (passport) - charts: add migrate job</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/ad9abf64ad7e2b959d565eaa0016066183444cd0"><code>ad9abf6</code></a> (passport) - passport: migrations add run_before</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/95ac66705669bd4301af9d3ae812e0843eb6a37c"><code>95ac667</code></a> (passport) - passport: optimize the use of master and slave database rules</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/204f7fc62fd0cdf016cd5e95a4d2fd2e6c841b17"><code>204f7fc</code></a> (passport) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/90a6410c0d0864a434b804cf80fe63960afd4493"><code>90a6410</code></a> (prometheus) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/2d8eb44ef28deae27ac54247a008a5351212eea0"><code>2d8eb44</code></a> (prometheus) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/9687a175b58aed22d314557d7254a82ff0a6d3dd"><code>9687a17</code></a> (rabbitmq) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/35d3d5b7e01bebbeeea5442a22f24d40fcbfdd93"><code>35d3d5b</code></a> (rabbitmq) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/6a6564ddef4f26bc81ea3eb9e965fb8e6180d092"><code>6a6564d</code></a> (rabbitmq) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/cb6722f0df93fae95d4480e1929b55e1e78a2a3a"><code>cb6722f</code></a> (redis) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/9553497d89e358022ab539cb3db658def17bc9cb"><code>9553497</code></a> (redis) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/1c8dc07b0167126d292e3db45f23db5d6ff111dc"><code>1c8dc07</code></a> (redis) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/9fa2a32f965d282940cd3f8489ce8959bb2e791f"><code>9fa2a32</code></a> (registry) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/9b09e51c1d548ba4d1c088aff761391092d746e3"><code>9b09e51</code></a> (registry) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7dbd3902139c8430c18bfb83e4dbce79a6df16a5"><code>7dbd390</code></a> (registry) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/e1d2a33d8c9f20eddce510d79df050b0fe90a94c"><code>e1d2a33</code></a> (registry-proxy) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/3eabfdda5c2a78fc49e73dce382263faad29f5c3"><code>3eabfdd</code></a> (registry-proxy) - charts: remove default limits</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/f8754dad5de5f88bb0f20f46d73e1cbab2aff68e"><code>f8754da</code></a> (registry-proxy) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7df73166e6ea521587eb2ba5b8e1626cc334d7f3"><code>7df7316</code></a> (registry-proxy) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/861d3b8f5ebc2ee32f11a600b26a14d79e0acdf1"><code>861d3b8</code></a> (storage) - filer: modify the default parameters of the filer</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/5fa08da71087503071fa780ac2469f4d55e7d0c5"><code>5fa08da</code></a> (storage) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/22c4620e0e724b26943260d58d749bb4efd0999b"><code>22c4620</code></a> (storage) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/6c1e29c1bf187e2b754d6f683014dba7a4ebe342"><code>6c1e29c</code></a> (timeseries) - postgres: add patroni params</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/e280d3ff2d799fa1e0738bf6e7585aaba0e72c58"><code>e280d3f</code></a> (timeseries) - dockerfile: install vi</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/5213617c4a5ace9225e1cad8348c736b943c5e25"><code>5213617</code></a> (timeseries) - dockerfile: install vim instand of vi</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/a569a57f06484738d5801651f9e253553347f928"><code>a569a57</code></a> (timeseries) - charts: add diagnostic mode</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/b93ec702dcbd0e2306d0290cde2d104d4c5897f3"><code>b93ec70</code></a> (timeseries) - woodpecker: migrations woodpecker-ci to 2</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/ff3b8705e65a56f0da392519b54f9b060894ec8c"><code>ff3b870</code></a> (timeseries) - charts: change canary app version</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/e334f74a71ffbd5f10baa38da43248d92c051322"><code>e334f74</code></a> (workflow-cli) - healthcheck: delete outdated healthcheck style</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/4f8b960e9ddcd1351b4567935d0a8d98d2aa843d"><code>4f8b960</code></a> (workflow-cli) - auth: add password login</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.5 + /blog/2024/02/27/drycc-workflow-v1.7.5/ + Tue, 27 Feb 2024 00:00:00 +0000 + + /blog/2024/02/27/drycc-workflow-v1.7.5/ + + + + <p>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.</p> +<h2 id="workflow--v174---v175">Workflow ## v1.7.4 -&gt; v1.7.5<a class="td-heading-self-link" href="#workflow--v174---v175" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.5.0 -&gt; v1.5.1</li> +<li>controller v1.6.3 -&gt; v1.7.0</li> +<li>logger v1.3.2 -&gt; v1.3.3</li> +<li>storage v0.0.3 -&gt; v0.0.4</li> +<li>redis v1.3.1 -&gt; v1.3.2</li> +<li>rabbitmq v1.2.0 -&gt; v1.2.1</li> +<li>registry v1.2.1 -&gt; v1.2.2</li> +<li>workflow-cli v1.5.1 -&gt; v1.5.2</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/95d130a19f63544defbf415d63ea44b650d07da7"><code>95d130a</code></a> (controller) - controller: volume support nfs</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ee2ee15992331922728aabcf03420fbad7b76a1d"><code>ee2ee15</code></a> (controller) - controller: container entrypoint error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/03ea4f87b58f2e3f12505ff0ba43ab655fdf0528"><code>03ea4f8</code></a> (controller) - controller: class property have been deprecated in python 3.11</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5f04d177fa399a7859d4f0d8e13b58e77983c2e9"><code>5f04d17</code></a> (controller) - controller: miss err msg</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/27972a3a48f5fb67283c50b95e58da7b7ef05458"><code>27972a3</code></a> (controller) - controller: load_db_state_to_k8s err</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a005d629bbdd9a5d68f5bb4c480fd9e6b51300c7"><code>a005d62</code></a> (controller) - controller: volume repeat path no error</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/c7a5ba62b8e513f43aad8143e507d23885558834"><code>c7a5ba6</code></a> (rabbitmq) - rabbitmq: cpu usage to high</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/45c20770d8203ae475c127fe82b00bd04334507d"><code>45c2077</code></a> (workflow-cli) - workflow-cli: miss err msg</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/bc738bd6ef19fa222e675058bc0af79b75026308"><code>bc738bd</code></a> (workflow-cli) - workflow-cli: volumes list format</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/35e1c063c5f40fc97f60ab2a0b9f66de37eef383"><code>35e1c06</code></a> (builder) - builder: bump golang 1.22</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/26caa36c197b968909da1a584dff686cd6bcd651"><code>26caa36</code></a> (controller) - deps: bump aiohttp from 3.9.0 to 3.9.2 in /rootfs (#118)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d938c4f00b4a972abe948dc814b2cbf41ea2b3b"><code>3d938c4</code></a> (controller) - deps: bump django from 4.2.7 to 4.2.10</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/e625c2f86176c0acff331f58f84da15d96041f21"><code>e625c2f</code></a> (logger) - logger: bump golang 1.22</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/bfa500dc9271bf0a475c50feb8e6be8574953bcd"><code>bfa500d</code></a> (redis) - redis: headless svc does not require ports</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/330209a5c329c0f34b47a07812e7282ad7890208"><code>330209a</code></a> (registry) - registry: headless svc does not require ports</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/48c42eb3d6ef09471d26a65c88f5cd88cd6684e8"><code>48c42eb</code></a> (storage) - storage: change volume index to leveldb</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/f4fde9d2c871162c14ecf0e993093211f49e7c66"><code>f4fde9d</code></a> (storage) - storage: add volume size limit</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/33e3684ec520a83bccdf7623d4b3d1317c10e9a0"><code>33e3684</code></a> (workflow-cli) - workflow-cli: volume support nfs</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/48d59507ab5f40e8a8cea9875b230e9e1b97644d"><code>48d5950</code></a> (workflow-cli) - workflow-cli: bump golang 1.22</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.6 + /blog/2024/02/27/drycc-workflow-v1.7.6/ + Tue, 27 Feb 2024 00:00:00 +0000 + + /blog/2024/02/27/drycc-workflow-v1.7.6/ + + + + <h2 id="workflow--v175---v176">Workflow ## v1.7.5 -&gt; v1.7.6<a class="td-heading-self-link" href="#workflow--v175---v176" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>storage v0.0.4 -&gt; v0.0.5</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/6cb63b632ab24cecda10e2e772f46e499d678aa5"><code>6cb63b6</code></a> (storage) - seaweedfs: bump version 3.63</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.2 + /blog/2024/01/29/drycc-workflow-v1.7.2/ + Mon, 29 Jan 2024 00:00:00 +0000 + + /blog/2024/01/29/drycc-workflow-v1.7.2/ + + + + <p>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.</p> +<h2 id="workflow--v171---v172">Workflow ## v1.7.1 -&gt; v1.7.2<a class="td-heading-self-link" href="#workflow--v171---v172" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>controller v1.6.0 -&gt; v1.6.1</li> +<li>logger v1.3.1 -&gt; v1.3.2</li> +<li>storage v0.0.1 -&gt; v0.0.2</li> +<li>timeseries v0.0.1 -&gt; v0.0.2</li> +<li>prometheus v0.1.0 -&gt; v0.1.1</li> +<li>workflow-cli v1.5.0 -&gt; v1.5.1</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2fe80a65e2f564abe94a04a4018af101ca10d55d"><code>2fe80a6</code></a> (controller) - resources: after resources instance update, could not delete (#111)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a4082ad0c4fca861bc713864ec4539249b707c0e"><code>a4082ad</code></a> (controller) - controller: resource status and binding</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e9bfccc307fd9631361eaedd1db0c98fb11f7a9b"><code>e9bfccc</code></a> (controller) - controller: fix multiple volumes mount at one dir error (#116)</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/58d2b4c35020c25e133f46bb48f7b512e41a0f91"><code>58d2b4c</code></a> (logger) - logger: redis conn error block</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/7cb2700c483040869f3fa5ff1af76cf68d8e8711"><code>7cb2700</code></a> (prometheus) - prometheus: prometheus config basic_auth</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/7838c6b63eec363ec0fccbc8a2b455477edb69db"><code>7838c6b</code></a> (storage) - storage: random accesskey secretkey</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/d9dcdfb7350c003a60883c9e70e3afca730d5419"><code>d9dcdfb</code></a> (storage) - storage: pod restart loses data</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/3cbdd29c8dd94d7bd046a3fe817dabbb59887225"><code>3cbdd29</code></a> (storage) - storage: tipd cannot start after deleting pod</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/be7e11fe5a8a861a976c27b69331779b4edd0a3a"><code>be7e11f</code></a> (storage) - storage: jq command not found</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/878f674be07b4aee660ec66830a9fe29473bdaba"><code>878f674</code></a> (storage) - storage: charts updateStrategy error</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/06cfe561e1327690dfcccd7151711053b8126a9a"><code>06cfe56</code></a> (timeseries) - timeseries: the data node ip is incorrect</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7f29f5a98049b0c256728dad38cf63026c45910e"><code>7f29f5a</code></a> (controller) - resources: retrieve resource instance response add message (#112)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4a84dcdca75a3c1cd037c01777cf410c21c56225"><code>4a84dcd</code></a> (controller) - controller: add deploy default annotations (#113)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/829d7e560317a0ac20081f6bd4c81f53b547aac4"><code>829d7e5</code></a> (controller) - controller: modify url match service name (#114)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/30abf6dba46d215d7747b4443826e6e3fac1138a"><code>30abf6d</code></a> (controller) - controller: transfer app ownership in async</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/dc6f45e98ab77a776a620286465da106a8109ba6"><code>dc6f45e</code></a> (controller) - controller: add channel for pod exec</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/af4f3a771d8a7c6f1f99c17acb67704d9f3f921f"><code>af4f3a7</code></a> (controller) - controller: avoid error when secret no data field (#117)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ca27956696aa6bd2e4adefcc6827f840eefd4b34"><code>ca27956</code></a> (controller) - controller: add pod default security</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/b2e9c647ff2a1e7828946d363b6cfc5bdca2deb7"><code>b2e9c64</code></a> (prometheus) - charts: node-exporter mount root (#2)</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/3cdb2b62fe9e2d6f7506c5215be9e3e7d27254b3"><code>3cdb2b6</code></a> (storage) - storage: bump seaweedfs 3.61</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/00dd2fd331104fd4f7ee58ca35a0906588318d16"><code>00dd2fd</code></a> (storage) - storage: add csi daemonset updateStrategy</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/48e763cb34c3e9b1004ad222a1e4670739e0b9ba"><code>48e763c</code></a> (storage) - storage: add drycc storage upgrade document</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/841df90682a121df819ea11ba8d2dc7843ffcd54"><code>841df90</code></a> (storage) - storage: bump seaweedfs 3.62</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/cefd52e7b031efc05f305a8d8f456229418556f8"><code>cefd52e</code></a> (timeseries) - timeseries: add check data node exists</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/ad1c46e39f392dd676a0f5c8e00b05ed1959cb95"><code>ad1c46e</code></a> (workflow-cli) - resources: resources instance add message</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/9f955c2c97a0a2875f7badadb4f868649cf44b2e"><code>9f955c2</code></a> (workflow-cli) - workflow-cli: add short options cpu</li> +<li><a href="https://api.github.com/repos/drycc/workflow-cli/git/trees/65399ef156b9fae2d2fe633cb6b4b63fb6263a1c"><code>65399ef</code></a> (workflow-cli) - workflow-cli: add tty resize support</li> +</ul> + + + + + + Blog: Drycc Workflow v1.7.0 + /blog/2023/12/08/drycc-workflow-v1.7.0/ + Fri, 08 Dec 2023 00:00:00 +0000 + + /blog/2023/12/08/drycc-workflow-v1.7.0/ + + + + <p>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.</p> +<h2 id="workflow--v160---v170">Workflow ## v1.6.0 -&gt; v1.7.0<a class="td-heading-self-link" href="#workflow--v160---v170" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.4.0 -&gt; v1.5.0</li> +<li>controller v1.5.1 -&gt; v1.6.0</li> +<li>database v1.2.0 -&gt; v1.2.1</li> +<li>passport v1.1.0 -&gt; v1.2.0</li> +<li>imagebuilder v1.1.0 -&gt; v1.1.1</li> +<li>fluentbit v0.0.0 -&gt; v0.0.1</li> +<li>logger v1.3.0 -&gt; v1.3.1</li> +<li>storage v0.0.0 -&gt; v0.0.1</li> +<li>gateway v0.0.0 -&gt; v0.0.1</li> +<li>monitor v1.3.0 -&gt; v1.4.0</li> +<li>redis v1.3.0 -&gt; v1.3.1</li> +<li>timeseries v0.0.0 -&gt; v0.0.1</li> +<li>prometheus v0.0.0 -&gt; v0.1.0</li> +<li>rabbitmq v1.1.0 -&gt; v1.2.0</li> +<li>registry v1.2.0 -&gt; v1.2.1</li> +<li>registry-proxy v1.2.0 -&gt; v1.2.1</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fcbebdae62029cf4308ffc0adeb8a90cf5550077"><code>fcbebda</code></a> (builder) - builder: use TCPRoute expose service</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d02bb5de832e50a281aa550c738b3eb653549806"><code>d02bb5d</code></a> (controller) - controller: support app dns policy config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9aa968ebccdebaf0971a6dbaa890320b9603a6a9"><code>9aa968e</code></a> (controller) - controller: add svc type support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/62e2d348e2987ebcdcaba993559dc1d30a8ffec6"><code>62e2d34</code></a> (controller) - controller: improve the services api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4393755b08a587e093b7603683ac8b5cdf654ac3"><code>4393755</code></a> (controller) - controller: use gateway replace ingress</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/323045d9ab1589c08a8090d7fe9c73ab6276281d"><code>323045d</code></a> (controller) - controller: add canary support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3f81c975baefd4018e6b3426965b4397456f0d0e"><code>3f81c97</code></a> (controller) - gateways: add addresses field</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4e64aa73d0fde9fe667064b420bd9375dbea8397"><code>4e64aa7</code></a> (controller) - gateways: add addresses field</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/02ad5811d9a8d3e031ce97f8ce85d0ce85be7619"><code>02ad581</code></a> (monitor) - grafana: add pd tikv dashboard</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/2a9e2b042941a911a31c846f71988d6eadeff811"><code>2a9e2b0</code></a> (monitor) - monitor: add storage monitor</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/41d5057b1d4067822edcf597e888b3f23e052d9d"><code>41d5057</code></a> (monitor) - grafana: data source change to prometheus</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/ec035d11f3fcf8486f4240aac8db4890e4520b53"><code>ec035d1</code></a> (monitor) - monitor: usegateway replace ingress</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c694c98cfab10d8381fd70d7efbbdaedc26caf2d"><code>c694c98</code></a> (monitor) - grafana: add drycc storage seaweedfs dashboard</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/1e1fdc8a8f3ca0974ff5d06ade500afed29a16ed"><code>1e1fdc8</code></a> (passport) - passport: use gateway replace ingress</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/ffdb408776bfa42c80ba5df56730c689a26a821a"><code>ffdb408</code></a> (prometheus) - prometheus: use gateway replace ingress</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/04152b99ca9a8aacddc246af78968191e41ea9d7"><code>04152b9</code></a> (rabbitmq) - rabbitmq: use gateway replace ingress</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0499500a1335791a89ffcab18e97b22d55ac232c"><code>0499500</code></a> (builder) - builder: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/642491d68a4958cdd6b9b78771ad512d7a462231"><code>642491d</code></a> (builder) - builder: no build log</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/873d146812f40de609100d9a2181d50e79695a54"><code>873d146</code></a> (controller) - controller: do not set entrypoint when no procfile</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d9028c53547b4d53d46d5cba508602ae31d0b391"><code>d9028c5</code></a> (controller) - controller: pip8 error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3efcfb764325255ff9ae4ca47ab82927e88ff9ab"><code>3efcfb7</code></a> (controller) - controller: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/18a3a1a3f777597966da8f8fb21545a18b44d887"><code>18a3a1a</code></a> (controller) - controller: miss service error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/94f796cd2ebd8dd76b4e8073cab039fed0211cae"><code>94f796c</code></a> (controller) - controller: drycc run pod should not restart</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/80f31614601daf30351033c3d9ce8610d4a41581"><code>80f3161</code></a> (controller) - controller: monitor query error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b76f2c5ee9c0e3461737ec7fc6cc73b73a0c043c"><code>b76f2c5</code></a> (controller) - controller: read websocket delay</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b6e068ee19354b98d613985c8c80ec6d42171cc0"><code>b6e068e</code></a> (controller) - controller: metrics sql tpl, gateway pod should not restart, cleanup old rs, update monitor datatbase config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ad9adc645759445702688b2a486ed5d6a1e6a5f7"><code>ad9adc6</code></a> (controller) - controller: rabbitmq sharding err</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/67739075a1134b817e9be97b7d594c1e3790f444"><code>6773907</code></a> (controller) - controller: default k8s pod annotaions</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ffcf1f931c395c3293d909f32a3bf35136b72776"><code>ffcf1f9</code></a> (controller) - controller: under-indented for visual indent</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3afd0cf8e36cec5bbfb59424d5ab036268287d3a"><code>3afd0cf</code></a> (controller) - controller: charts env error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/769bb8b8dc47ef032377a61e6288c514bff16a9b"><code>769bb8b</code></a> (database) - database: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/769bb8b8dc47ef032377a61e6288c514bff16a9b"><code>769bb8b</code></a> (database) - database: label conflict error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/6a321c5c802b3a0826bc283f2ffe429769f8753c"><code>6a321c5</code></a> (database) - database: link error</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/558feae9c0edfb4fa7f0dae08f09dc987f822c88"><code>558feae</code></a> (fluentbit) - fluentbit: build charts error</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/98d8a2a6046dffa3213f84fd5cb2f054727ca798"><code>98d8a2a</code></a> (gateway) - fixup</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/8b5dde1d5b0107913f3fca7c90703902fd9a360e"><code>8b5dde1</code></a> (gateway) - gateway: secretName</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/702866da3014497e303eb346be0f88c3c161586c"><code>702866d</code></a> (gateway) - gateway: build status</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/f55dac1cbab3214f60b33992f3e08e186bfa6198"><code>f55dac1</code></a> (imagebuilder) - imagebuilder: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/ac13b5f036e036073d39ddf2e34627be340df078"><code>ac13b5f</code></a> (imagebuilder) - imagebuilder: build svg</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6b7bbc5a38a8550457585908ac7ce9858c19a034"><code>6b7bbc5</code></a> (logger) - logger: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/0136b5c3ac711f132be35d8382f9df9268145be6"><code>0136b5c</code></a> (monitor) - monitor: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f03d975fe88a4419f58b54f8d1ac944f968b0bfe"><code>f03d975</code></a> (passport) - passport: DRYCC_GRAFANA_DOMAIN error</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/b530ea8960c173b16968dc5c4da5f8e5f783d9dd"><code>b530ea8</code></a> (passport) - passport: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/be5a0a77f5e037456676af5617cdcd01c2f868ea"><code>be5a0a7</code></a> (passport) - passport: change passport</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/1596c7f723d493b8f17e367999e0315d7f2bc205"><code>1596c7f</code></a> (rabbitmq) - rabbitmq: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/0dc4f6fef0bf147e2cec96cd26f490ae5799fa57"><code>0dc4f6f</code></a> (rabbitmq) - rabbitmq: images-shard error</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/43293ae792f0fc8fa932b7fac865f57510de793d"><code>43293ae</code></a> (redis) - redis: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ca13b7d7592995b057f1075b3223074c7a9de54b"><code>ca13b7d</code></a> (registry) - registry: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ab5c7937aac830c2b09b08777f39180248911442"><code>ab5c793</code></a> (registry) - registry: garbage collect error</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/ab0fabc77483f531acaeaa089afce1636200c20a"><code>ab0fabc</code></a> (registry-proxy) - registry-proxy: manifest error</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/dfc72361f70380697d7090cb0e5bfa61c5264560"><code>dfc7236</code></a> (registry-proxy) - registry-proxy: daemon yaml format</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/42c03bee957cb46b5703cd163cea24c754b3cccc"><code>42c03be</code></a> (storage) - storage: seaweedfs csi error</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/453e41a13ecaedf256dc823c37de3233a2f60cab"><code>453e41a</code></a> (timeseries) - timeseries: could not register node</li> +</ul> +<h4 id="docs">Docs<a class="td-heading-self-link" href="#docs" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/5433c8907bdf4c0320566878a0cfc4f38730f3d4"><code>5433c89</code></a> (gateway) - gateway: add prerequisites</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2f0c5d8ed5a227507f7848426824759db673eb20"><code>2f0c5d8</code></a> (logger) - logger: change architecture</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/bdd02ebf1178209cca08c0e94d76638405100083"><code>bdd02eb</code></a> (builder) - builder: use dynamic clusterrole name</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/66b4b25ec7c517152a37e375f9a7e86e05cceada"><code>66b4b25</code></a> (builder) - builder: upgrade new controller-go-sdk</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/219d86f6bebf11fce80e2535b724bf8ad94b204b"><code>219d86f</code></a> (builder) - builder: upgrade go.mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/91f2f14b0b02af099fe67d4a9be65432de0cb18d"><code>91f2f14</code></a> (builder) - builder: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9abca168d6a8b26f45a3787c2a80bf5aa6354451"><code>9abca16</code></a> (builder) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f43dd5030ac3715ab96cfb2a114bd0416b21110c"><code>f43dd50</code></a> (builder) - deps: bump golang.org/x/net from 0.2.0 to 0.7.0</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0384c69ad46cdabeabb3ca23d01367d047eb0c84"><code>0384c69</code></a> (builder) - builder: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e3149b95e8c64c1d01444d58de67aa4747c4ebf7"><code>e3149b9</code></a> (builder) - builder: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d88ea1bd5538e5425cb4cbb856ab82bb5dfe47e8"><code>d88ea1b</code></a> (builder) - builder: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ba590303b791ff954e41a64ef8babe54170aba3b"><code>ba59030</code></a> (builder) - builder: upgrade go.mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1114dd7d951215c23a6fcefc75a5a71a85391561"><code>1114dd7</code></a> (builder) - builder: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fe50b626d9edf4908f6c820fa2714e5bde0fbc0e"><code>fe50b62</code></a> (builder) - builder: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/db3950cf47cd8f5f0c06c579eec1189c2bcdb0b3"><code>db3950c</code></a> (builder) - builder: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5a508bbc9e21852c4e47e598bb42a7c8c75e93ee"><code>5a508bb</code></a> (builder) - builder: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/bbb9029e773f24d2692afdd801e8d09ca75538a3"><code>bbb9029</code></a> (builder) - deps: bump golang.org/x/net from 0.12.0 to 0.17.0</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f4e5d6ca78d597e020ce398fd9fd132c41591826"><code>f4e5d6c</code></a> (builder) - builder: remove health url</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9111c8ffd87978db6734d405ef0362c34b9fe4ef"><code>9111c8f</code></a> (builder) - builder: remove io/ioutil</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1f36e3ddd67b29571707c57819bdd8148647359c"><code>1f36e3d</code></a> (controller) - deps: bump django from 4.1.2 to 4.1.6 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e4ab434db6fd84cd35a127c8414951df7e138503"><code>e4ab434</code></a> (controller) - controller: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9f0301e4a138d337d9530807b347775d25ee6525"><code>9f0301e</code></a> (controller) - deps: bump django from 4.1.6 to 4.1.7 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/39324238c251f982072b28fdbb79c04df6230889"><code>3932423</code></a> (controller) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ae8b6b464f3733bd0ca743bd419ecf806646909f"><code>ae8b6b4</code></a> (controller) - setting: support KUBERNETES_LIMITS env config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c10b9bc740f74ed820d36ba5cb6eb462bce3bb7c"><code>c10b9bc</code></a> (controller) - controller: using the api_version instead of hard coding</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e6908cd934ec0360344c2120bbd4bd9a27b6fe9d"><code>e6908cd</code></a> (controller) - controller: upgrade requirements</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b0eba0c0f03b3b74bf6b2d013a8e2fd69dd5fc6c"><code>b0eba0c</code></a> (controller) - controller: add route rules serializer</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2e4b6a457f6ab66137badecaa0ce5a020e2208e2"><code>2e4b6a4</code></a> (controller) - controller: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7d32b55dad2a0da5a2d539c970608182dfd00c52"><code>7d32b55</code></a> (controller) - controller: upgrade to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f2dc8dd737e44d1297f6a6903bc17392f767a828"><code>f2dc8dd</code></a> (controller) - controller: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5739b8306921408b11b921515cd6dc7a818e6a1a"><code>5739b83</code></a> (controller) - controller: use timescaledb replace influxdb</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/53892cb796b69ba91b1520ee2b1e35bf6516fb57"><code>53892cb</code></a> (controller) - controller: add timeseries</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0fe0eae17d2af7e0a955d6e8041db22a66b64317"><code>0fe0eae</code></a> (controller) - controller: upgrade requirements</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/18b2a915d043cade51e0d4017d08e4ffa9f54dd6"><code>18b2a91</code></a> (controller) - deps: bump aiohttp from 3.8.4 to 3.8.5 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f50874a6e180d9a18fd3a9b9ad1ec1491acae114"><code>f50874a</code></a> (controller) - controller: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/956cd081922f8eeda637530e8397a40d9f7d9c3d"><code>956cd08</code></a> (controller) - controller: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9ab3ead47263e0f00f5d31afdad028eedefd6a56"><code>9ab3ead</code></a> (controller) - controller: remove passport url check</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a24c7b011de56845fcc0ffaa78424d60e6cb8aac"><code>a24c7b0</code></a> (controller) - controller: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f7e539acb9890593d5b3ba970221f333b81abff5"><code>f7e539a</code></a> (controller) - controller: change celery priority</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ab77a529bc9ac2e61a45af4676b8d8796789f014"><code>ab77a52</code></a> (controller) - controller: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8e27501fc6f024bd590508ad827d6a28ca871776"><code>8e27501</code></a> (controller) - controller: dynamic app storage class</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/385978b8f8a07696196974f7f021886448fbc31c"><code>385978b</code></a> (controller) - controller: list_pods datetime format</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b20362c09cf14cbb64148476948481bca11fcf99"><code>b20362c</code></a> (controller) - deps: bump django from 4.2.3 to 4.2.7 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e11ae1ba7d5ef0423b6a51874704739e6a3c86df"><code>e11ae1b</code></a> (controller) - controller: add cluster migrate</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ca6e9dfa4e90c613572faf449445cebabcf1a310"><code>ca6e9df</code></a> (controller) - controller: async mount</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9a7fbfc5e7037dbcd6f8415da1540fc0d0785bff"><code>9a7fbfc</code></a> (controller) - controller: remove FOSSA</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d55279d81f93783dfdcf0af47c429094fd45019"><code>3d55279</code></a> (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d498a11d8c1179d9ef7e09d4638b10663fc3266d"><code>d498a11</code></a> (controller) - controller: add measure loalancers</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/249a985410e98ab0250af7eaf88c28735f2d7ef1"><code>249a985</code></a> (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b967f5846a006e03d41374266d689a34bd387ba8"><code>b967f58</code></a> (controller) - deps: bump aiohttp from 3.8.6 to 3.9.0 in /rootfs (#107)</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8ca9ed61477fe4c538b0eefbe08f42757f9ec527"><code>8ca9ed6</code></a> (controller) - controller: no longer restrict reserved domain</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9ff6649b311185927398a12d55451897015ba491"><code>9ff6649</code></a> (database) - database: add init database configure</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9b4cd26e827862bbcbd2f95eb9ff5aea3031ef80"><code>9b4cd26</code></a> (database) - database: use dynamic clusterrole name</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/b59cde4a41499b1739f51776524c969963706a1e"><code>b59cde4</code></a> (database) - database: remove minio require</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/86462f8e432c21ed691f17544313747a1a95bf2a"><code>86462f8</code></a> (database) - database: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1e8555a4fa0aa4ab14e276af95eeadb11e7ea2f3"><code>1e8555a</code></a> (database) - database: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1b762d54948614e8ff8179f91ba4087c1c24cd93"><code>1b762d5</code></a> (database) - database: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9ffe1fdcc1d1fd33e1d5a69d38c6e2c044f7e002"><code>9ffe1fd</code></a> (database) - database: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/69466d71dfb0fac98f5e2372eae4923d2cb55dde"><code>69466d7</code></a> (database) - database: add database extension</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/beb4b628783f30b8dec35f0ee50d179a27781915"><code>beb4b62</code></a> (database) - database: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/67e27148766a6a16379bccbb160df881e8638cfa"><code>67e2714</code></a> (database) - database: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/8f328f85f28b51b0ea8ce4fe508701c2e875a668"><code>8f328f8</code></a> (fluentbit) - fluentbit: no limit buffer size for kube api</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/fc0552c72b83267e37d67766a0e1040c7d3d59d8"><code>fc0552c</code></a> (fluentbit) - fluentbit: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/63a6cab0c5004ade3c332f16d87f70daaebc12b0"><code>63a6cab</code></a> (fluentbit) - fluentbit: change fluentbit match</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/220f81adae775c21f6eac5fca0f16f2f96962e7d"><code>220f81a</code></a> (fluentbit) - fluentbit: run as no-root</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/aec1393d9e976f2ecb24281a3fc92f5f8bdcf563"><code>aec1393</code></a> (fluentbit) - fluentbit: change configmap name</li> +<li><a href="https://api.github.com/repos/drycc/fluentbit/git/trees/1af4fd24c9e061cb74c3c09af75ad33262a74a19"><code>1af4fd2</code></a> (fluentbit) - fluentbit: change default stream name</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/bef90adfd96f4c713a7de261cb2c66e7cb9900af"><code>bef90ad</code></a> (gateway) - gateway: add route for gateway</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/d523ddb7f794774c5e237c10779fe43713cdc0b6"><code>d523ddb</code></a> (gateway) - gateway: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/d9137f4c7681be9edacc2f1123660d0feb961601"><code>d9137f4</code></a> (gateway) - gateway: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/gateway/git/trees/0425dd4e7a0399fd757a80880e67eda2e8c150fc"><code>0425dd4</code></a> (gateway) - gateway: add customListeners</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/3982b86cb7515d42ead064dee86b931f2f4c58a7"><code>3982b86</code></a> (imagebuilder) - imagebuilder: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/3e4e7a329c7532d8787c9c76eb71d938d12fad45"><code>3e4e7a3</code></a> (imagebuilder) - imagebuilder: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/8df6e8e0e6684a4c4a21bf477958b36eb6750e97"><code>8df6e8e</code></a> (imagebuilder) - imagebuilder: upgrade stack version</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/a5601f7588843698b336eccacbc12559dc915779"><code>a5601f7</code></a> (imagebuilder) - imagebuilder: add drycc_app env</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/07465f8bc16cbb15e12d02d522df94265d503c45"><code>07465f8</code></a> (imagebuilder) - imagebuilder: upgrade to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/00d22d2a3c3fa5dce5595fee94bfa8d5a5ca9b2c"><code>00d22d2</code></a> (imagebuilder) - imagebuilder: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/0b7a24e9211acef3252234e4ebce81353c2a8218"><code>0b7a24e</code></a> (imagebuilder) - imagebuilder: upgrade podman/mc/caddy</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/a7d8be869f0b128e9fc6a28ec5c45e5cdca0ea90"><code>a7d8be8</code></a> (imagebuilder) - imagebuilder: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6b2da83d29e0210a9307e4c5ad1199ed7d7599ce"><code>6b2da83</code></a> (logger) - logger: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/8245b2588a3c350b9c1405c9e56664881534c4b4"><code>8245b25</code></a> (logger) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/f811a74710324fa3ac4ac1fbafc76fe38b042c33"><code>f811a74</code></a> (logger) - logger: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/413f6f60b255f43adbf98cfdbdf2a8325cf3327a"><code>413f6f6</code></a> (logger) - logger: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2ac6b101d2a205cce7653dcbf635cf1afea8e47e"><code>2ac6b10</code></a> (logger) - logger: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2581426b262362e04fc4906cfb7d4567ca58d40a"><code>2581426</code></a> (logger) - logger: bump redis to v9</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/364b25aebe91236be41b5974b3643fc1a2b6d352"><code>364b25a</code></a> (logger) - logger: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/dc169a303663ce319037fcf19d0b6bd164b8ee82"><code>dc169a3</code></a> (logger) - logger: use fluentbit replace fluentd</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/d855d91ba3b4651d2a384f3919a39a84f6794b95"><code>d855d91</code></a> (logger) - logger: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f76723507196a4814dc98e8d9c6403157b6273c4"><code>f767235</code></a> (monitor) - monitor: add off-cluster passport configure</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/ab23936f8d8610f88c061996217b28a8da0ffe3d"><code>ab23936</code></a> (monitor) - monitor: use dynamic clusterrole name</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/47beee0619ee974ad702d813e4db39b187a0507b"><code>47beee0</code></a> (monitor) - monitor: change tikv secret key</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/af7703f7a646a074adf89f9e1d7681bc2a4a8cfb"><code>af7703f</code></a> (monitor) - grafana: remove panel when component off-cluster</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/1b870c2a5b5212d9aeae8dd720bab8190a2b8002"><code>1b870c2</code></a> (monitor) - monitor: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/4a5f1f164c48e93271e28e5a252eb9c87ce4e293"><code>4a5f1f1</code></a> (monitor) - grafana: up ldap api_url config</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/143cabe692cd9d80f909afbe91de0bb8b3c18dea"><code>143cabe</code></a> (monitor) - monitor: add prometheus architecture diagram</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/93091c2dcde35d1ca63450ba08cd2e92b532cdda"><code>93091c2</code></a> (monitor) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/0b7045a1ec3d0061a8434e7e8beed47183287b2c"><code>0b7045a</code></a> (monitor) - grafana: add dashboard kubernetes_deployment_metrics</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/2fb1839f48277724e394b04697d1eb1fb748bf3e"><code>2fb1839</code></a> (monitor) - woodpecker: pipeline config VERSION, when build container image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e2724164a3e2855d1f62e4bdcdcff99f6b10e48f"><code>e272416</code></a> (monitor) - monitor: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/abc0e5373a0aef065fd8887e9f8bee5fd13a5e92"><code>abc0e53</code></a> (monitor) - monitor: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/86cc01bd318becf9528feffcfd7c6080c3faafa2"><code>86cc01b</code></a> (monitor) - monitor: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/1cd849ff6f8367375f6d80430e9fe623ebe0162d"><code>1cd849f</code></a> (monitor) - monitor: add postgresql outputs</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c3205c04418bbb794286eca1bcaa2bf37f26437c"><code>c3205c0</code></a> (monitor) - monitor: change default agent config</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/8c802c01af85fbf40b42c124cd6c72a7c3d8266d"><code>8c802c0</code></a> (monitor) - monitor: add timeseries database</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e9abc40801c5d90934d19b5ca1b838dbdf9b2431"><code>e9abc40</code></a> (monitor) - monitor: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6af66cd45685080c5242f6bc6758df35e0c7a69f"><code>6af66cd</code></a> (monitor) - monitor: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/d02d718b64837e2869aea66f8a9205d0d3205feb"><code>d02d718</code></a> (monitor) - monitor: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/3509c2916b9b6aabe709b0057afdacbdc747e462"><code>3509c29</code></a> (monitor) - monitor: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/ed7bfa2f0c17b3e2577f168af719a6c9b3adc436"><code>ed7bfa2</code></a> (monitor) - monitor: optimize env PROMETHEUS_URL</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/da89befad4be1c66ae33740c7a2567b8b83b6b46"><code>da89bef</code></a> (passport) - passport: charts codereview</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/61c4a964022e28f81727efdc858e5ec3a07a71fb"><code>61c4a96</code></a> (passport) - passport: support init app config</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/91010068522d524dfd6680d09915a5444e29a1ba"><code>9101006</code></a> (passport) - passport: add initApplications to charts</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/7dd7fa414f07cc61771cec2d3e98cc1a32d38a00"><code>7dd7fa4</code></a> (passport) - passport: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/4400199ac576b00e0e268ca74d18ff1da15f32bc"><code>4400199</code></a> (passport) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/6b2c546ec6a5dd0311667cab1ac322819ea71918"><code>6b2c546</code></a> (passport) - passport: change secret name to drycc-passport-auto-tls</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/c8bd824c567bfc68df8fd118ad5a9805242507bd"><code>c8bd824</code></a> (passport) - passport: upgrade requirements</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/aee5aefe0c074816b6ba99624f0e2e5fb6462516"><code>aee5aef</code></a> (passport) - passport: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2d819533a0d6e10534e5a82fac370dd67ef96fc2"><code>2d81953</code></a> (passport) - passport: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/9e662428f39d73651a0c70bd613595c7205c4494"><code>9e66242</code></a> (passport) - passport: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/0fca9982e2ff45bbb5ebe7e3e91fcf0a6af52d94"><code>0fca998</code></a> (passport) - passport: upgrade requirements</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/348252849763e5e96b5908293bd78d84b52b6ad0"><code>3482528</code></a> (passport) - passport: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/0c5ec939da419910c9e98ea97cee9d66916ba14f"><code>0c5ec93</code></a> (passport) - passport: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f7b8f5312d0e9707d2f41b14fb1113e2dfa63dc3"><code>f7b8f53</code></a> (passport) - passport: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/baf69da9f8b9e1858fa89418e12f3133ab567d88"><code>baf69da</code></a> (passport) - passport: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/fcd45dd063da8338c812d5d8af9c41c6d4405826"><code>fcd45dd</code></a> (passport) - passport: add cluster migrate</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/da6d32a3f09d43209fd1037cb1cff810ddcdcf68"><code>da6d32a</code></a> (prometheus) - prometheus: add prometheus-config</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/683de9e2c03941152196e4fb986cb9ce8e7c1a0f"><code>683de9e</code></a> (prometheus) - prometheus: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/3323300fa23d53bc09e3e70041f4a300aaace68b"><code>3323300</code></a> (prometheus) - prometheus: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/da1d356e3f978a01fcbbd6b5996ff9272748ed87"><code>da1d356</code></a> (prometheus) - prometheus: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/4e7a936edaf8446d48b80e69afd610af6d59a6a4"><code>4e7a936</code></a> (prometheus) - prometheus: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/44c1c6f6a3a11cd1792753c7ba94faf6675e8fa3"><code>44c1c6f</code></a> (prometheus) - prometheus: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/d1f1dda09da1cd0b82dd18854e196b206e27e931"><code>d1f1dda</code></a> (prometheus) - prometheus: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/0836fc1cea544fd928fb6727c99ca9369a1c2134"><code>0836fc1</code></a> (prometheus) - prometheus: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/prometheus/git/trees/9e132322c6c36fde1a6ce4f8fabce6ffdb73cb32"><code>9e13232</code></a> (prometheus) - prometheus: add LICENSE</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/f53e14a9e741122cef2a88976a4ccafc6ad6f6fd"><code>f53e14a</code></a> (rabbitmq) - rabbitmq: remove auto user</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/0ec7277c5624b35ea1ac9d5d88a9eddb75278794"><code>0ec7277</code></a> (rabbitmq) - rabbitmq: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/f376a30bdb6223f03b7d3e40eb3093616830291b"><code>f376a30</code></a> (rabbitmq) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/51405d8f429584fcf5d38a7b1422971304f3981c"><code>51405d8</code></a> (rabbitmq) - rabbitmq: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/463ca03544a31a0a6c98ceb4862e9cd15a47271b"><code>463ca03</code></a> (rabbitmq) - rabbitmq: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/1978a714c0f868de9d4dfc863be003c313d3db6f"><code>1978a71</code></a> (rabbitmq) - rabbitmq: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/139277f11035e0e548bfdc35272579806cd8bb0c"><code>139277f</code></a> (rabbitmq) - rabbitmq: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/be49741721134fd966c09ea44ef87b705668c8a2"><code>be49741</code></a> (rabbitmq) - rabbitmq: change drycc gateway listener name</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/6d22518f5bbb3883bc4bdc05b6c93ea6b40e3be9"><code>6d22518</code></a> (rabbitmq) - rabbitmq: remove gateway route</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/0eb7833ac8a01bbde78f3e0172e6d3d2948d6234"><code>0eb7833</code></a> (rabbitmq) - rabbitmq: add check shards</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/921106312dc679e79c8dc8ce226ae62fa68ce0ec"><code>9211063</code></a> (rabbitmq) - rabbitmq: erlang vm tuning optimization</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/648a78d9b886890e924250a198624972d28a2ad8"><code>648a78d</code></a> (rabbitmq) - rabbitmq: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/0b43a4d04556eb2bfa81cc8ed22d84d636ad45d1"><code>0b43a4d</code></a> (rabbitmq) - rabbitmq: add x-random exchange</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/ad1c4da3f11a1e690508c71a992a3bda86b56201"><code>ad1c4da</code></a> (redis) - redis: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/3f37f92a06db4b06c105718bec48aeaac2bf1a31"><code>3f37f92</code></a> (redis) - redis: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/e3bef7a15e73fb77ba76ac4f0140fa03ebd2a813"><code>e3bef7a</code></a> (redis) - redis: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/4e806d40f4a203db5c91dd184a712fba8ce55820"><code>4e806d4</code></a> (redis) - redis: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/d5023be85937f1f4cf4b625fb8250a63c4776f3b"><code>d5023be</code></a> (redis) - redis: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/98f5d6fa30d4fb28c89eb547a0e2631aa34a46ac"><code>98f5d6f</code></a> (redis) - redis: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/063f29e85bc565c29d19b900b96017161263cb88"><code>063f29e</code></a> (registry) - registry: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/17bf8ae8cc1a257ff978a6a8ee27d8988f3ed9c2"><code>17bf8ae</code></a> (registry) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7bbad151b1d5c934f9d81a882ea6ebef16bf1723"><code>7bbad15</code></a> (registry) - registry: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/279154fdec97b5e0d28a5c27481928d433ac1369"><code>279154f</code></a> (registry) - registry: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/3e4ae840d5718521278051122c19b96b9dbf2791"><code>3e4ae84</code></a> (registry) - registry: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/fa322d6c372fd6d622a2054584bbcab934ff67f0"><code>fa322d6</code></a> (registry) - registry: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/6c18fe004f3431a59ecd5c874c3bd77af544c661"><code>6c18fe0</code></a> (registry) - registry: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/0bc8472a7baa4b8f982694b97528fa984c03639d"><code>0bc8472</code></a> (registry) - registry: remove health url</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5dacd9f735816decc4b6af7c4994a75ce280d92b"><code>5dacd9f</code></a> (registry) - registry: add wait-for-port check</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/fdeefc3888d5ec0dbfff8db6c797621a90896531"><code>fdeefc3</code></a> (registry) - registry: use headless</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/08bf9f882de2d94f8c3bdefafe24fafa9b9870c4"><code>08bf9f8</code></a> (registry) - registry: change registry port to 5000</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/40bcea2ddf3a6e6316422e14a25df360fb4dcf81"><code>40bcea2</code></a> (registry) - registry: add registry push test</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/871b8e72735b0c17f4c692ea53495e1abb4497d1"><code>871b8e7</code></a> (registry) - registry: add default env</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7f3b3aceea1cc28475f9cec0a3244f693eaf1e6a"><code>7f3b3ac</code></a> (registry) - registry: bump registry 2.8.3</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/569f15dca6d21c69f3ad3734e6509addf2caf913"><code>569f15d</code></a> (registry-proxy) - registry-proxy: use woodpecker replace drone</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/cc33caf06d9aa2c4bec7a745aa233f8827695972"><code>cc33caf</code></a> (registry-proxy) - woodpecker: use woodpecker ci build status</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/0002aab36b2692250f8653db3505a0300275bea3"><code>0002aab</code></a> (registry-proxy) - registry-proxy: add chart appVersion</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/40af10ba90e5e0e6e050f5d97625a1294ab6f910"><code>40af10b</code></a> (registry-proxy) - registry-proxy: upgrade codename to bookworm</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/c56b9dff701130403d9d0ecc932069fa16d2e462"><code>c56b9df</code></a> (registry-proxy) - registry-proxy: add codename build-arg</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/9d5bfe091bddf0f6d7d0cd8995823540b084dc77"><code>9d5bfe0</code></a> (registry-proxy) - registry-proxy: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/e6a33500e5eba9a32baa3f2e9841e67546236965"><code>e6a3350</code></a> (registry-proxy) - registry-proxy: change worker_processes to 1</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/726f39d51f196a28effb917fbacb20db960cf5f3"><code>726f39d</code></a> (storage) - storage: add volume compactionMBps</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/a5aa2d87bd4d320e30833cbe3e3598f5199e7da5"><code>a5aa2d8</code></a> (storage) - storage: add threshold to vacuum and reclaim spaces</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/e687d044f2796dbfef23239df62337b2e658b797"><code>e687d04</code></a> (storage) - storage: delete disk type in single disk case</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/75ee2e4f4acfa1c4fd8f725252ffdc8a30495dda"><code>75ee2e4</code></a> (storage) - storage: change datanode replicas to 4</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/c5fd7bad70e239cd389fc92372305435e099d4ce"><code>c5fd7ba</code></a> (storage) - storage: delete useless env</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/b3826ea800b1fbde96178f590d25361560f3bc3a"><code>b3826ea</code></a> (storage) - storage: add ssd hdd dir</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/29881a0702b1e68e69c86e6ae96da8c4eda209a4"><code>29881a0</code></a> (storage) - storage: add balance cronjob</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/c5a0f512283eb2c32814f3b2f3c0e3ebfb57bd1f"><code>c5a0f51</code></a> (storage) - storage: add defaultReplication for seaweedfs master</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/543c7a273c2988d477782ba97462263c93068669"><code>543c7a2</code></a> (timeseries) - timeseries: use podman replace docker</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/5376024ea1489cf311fd18dd691ab5b80eb4e5e8"><code>5376024</code></a> (timeseries) - timeseries: update timeseries-service-replica</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/52e8520d0e2bb6b0625304a8e29d3b680bc44840"><code>52e8520</code></a> (timeseries) - timeseries: bump common 1.1.2</li> +<li><a href="https://api.github.com/repos/drycc/timeseries/git/trees/f82657ceb0cdf390fb07e721ce57e07081d43968"><code>f82657c</code></a> (timeseries) - timeseries: add start script</li> +</ul> + + + + + + Blog: Drycc Workflow v1.6.0 + /blog/2022/10/21/drycc-workflow-v1.6.0/ + Fri, 21 Oct 2022 00:00:00 +0000 + + /blog/2022/10/21/drycc-workflow-v1.6.0/ + + + + <p>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.</p> +<h2 id="workflow--v150---v160">Workflow ## v1.5.0 -&gt; v1.6.0<a class="td-heading-self-link" href="#workflow--v150---v160" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.3.0 -&gt; v1.4.0</li> +<li>controller v1.4.0 -&gt; v1.5.0</li> +<li>passport v1.0.0 -&gt; v1.1.0</li> +<li>database v1.1.0 -&gt; v1.2.0</li> +<li>imagebuilder v1.0.1 -&gt; v1.1.0</li> +<li>fluentd v1.2.0 -&gt; v1.3.0</li> +<li>logger v1.2.0 -&gt; v1.3.0</li> +<li>storage v1.2.0 -&gt; v1.3.0</li> +<li>monitor v1.2.0 -&gt; v1.3.0</li> +<li>redis v1.2.0 -&gt; v1.3.0</li> +<li>influxdb v1.1.0 -&gt; v1.2.0</li> +<li>rabbitmq v1.0.0 -&gt; v1.1.0</li> +<li>registry v1.1.0 -&gt; v1.2.0</li> +<li>registry-proxy v1.1.0 -&gt; v1.2.0</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/52517d9323bfcd246e1fd8e13bdee2c45739136a"><code>52517d9</code></a> (builder) - builder: update controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1d78ca01de03c80ac86687999d82dba0077df31a"><code>1d78ca0</code></a> (builder) - builder: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/26b69801c78321da8754c814b6503ec76e857a1b"><code>26b6980</code></a> (builder) - builder: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bfd43851009116d6d4bceb4c46edc3cd21cf9d41"><code>bfd4385</code></a> (controller) - controller: add get manager user status</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/874208d8501198ed8780f2e820ab112d3b78eae2"><code>874208d</code></a> (controller) - controller: unified measurement model</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/cadf98f888c384890c529700c16208b17e17dff2"><code>cadf98f</code></a> (controller) - controller: add admission webhook</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e0050c23869dd3a1d5e8038859a7324484b227b2"><code>e0050c2</code></a> (controller) - controller: new measurement model</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a11ba587b73058c3af610fc9fc101e5d446eb43f"><code>a11ba58</code></a> (controller) - controller: multi pod restart uses async</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/fb3c15d70041d4b215c34b5625cb82ae52279d2b"><code>fb3c15d</code></a> (controller) - controller: add check app owner status</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d78b764c874c30f23aa7e6db9a0d03cb09b6a24"><code>3d78b76</code></a> (controller) - controller: add resource services api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d6a2012ab840dcde1be3c8f197df76eac9c5d88"><code>3d6a201</code></a> (controller) - controller: add search apps api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/01c443a3bf142d6497d20492e3ee7f534db64322"><code>01c443a</code></a> (controller) - controller: add KUBERNETES_CPU_MEMORY_RATIO parameter</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7c2623276991b46b7ac2b8e9d8ce2f84e8ebf26b"><code>7c26232</code></a> (controller) - controller: add volume size limit</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3bee749fc0c670d3ee371c7ffb031f47f0d45873"><code>3bee749</code></a> (controller) - controller: add annotations support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/23cd97c1f213ea9dcec45a4a40e9c3942904e55a"><code>23cd97c</code></a> (controller) - controller: traefik v2 support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e37b7db45049776d7d7455e01f5928986b24b043"><code>e37b7db</code></a> (controller) - controller: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b3b367b108bea56a5fa5ccc603f0dafc14bb5edb"><code>b3b367b</code></a> (controller) - controller: add volume expand support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a4e154aaf0f6cd3b01ebbab0a4af1a4b693a45a4"><code>a4e154a</code></a> (controller) - controller: add database replica support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2f37216fbaed5fa707c76b44881b1f7507a75f49"><code>2f37216</code></a> (controller) - controller: switch wsgi to asgi</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b3314a50607e9d5383d0ce954811827acae8fa05"><code>b3314a5</code></a> (controller) - controller: add pod exec api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/75df2dce65591da4e1e56c7f56a1903749fa4e20"><code>75df2dc</code></a> (controller) - controller: add stream support for app logs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4229badbcd4e367cbe13bf13f2b5c62271b7b31e"><code>4229bad</code></a> (controller) - ccontroller: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/89bb19b20f2eb0d8918cdc7223fa3b117af620d5"><code>89bb19b</code></a> (database) - database: upgrade to pg14</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9f45a5d5e9b7871c47acd73ce227856c1683f6a2"><code>9f45a5d</code></a> (database) - database: add hugepages support</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/c4008c9fbe0f99d1200a58466a15466d92840fa5"><code>c4008c9</code></a> (database) - database: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/411a7b269a3333caed809a1afac69578a7c5ad9b"><code>411a7b2</code></a> (database) - postgres: use patroni</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/64e5cb0aaaacfa2d9976e278583fa700c858ce92"><code>64e5cb0</code></a> (database) - database: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/2bab823194abea35c7a1ff4d59db6a88eb19fcad"><code>2bab823</code></a> (fluentd) - fluentd: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/337ba62d587a4f6c7321aa6ef843d5764692a09e"><code>337ba62</code></a> (imagebuilder) - imagebuilder: run podman as rootless</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/4396ffaeb6a2751e6f78907ac7c517966b5e3c08"><code>4396ffa</code></a> (imagebuilder) - imagebuilder: switch to oci charts</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/f37ae0927023685d88f9e594d8316d8c40cd5296"><code>f37ae09</code></a> (influxdb) - influxdb: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/04503b2c0d5c455c1a106c71be727d2b2b14a2f8"><code>04503b2</code></a> (influxdb) - influxdb: add influxdb ha</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/41ddad5e9acb54fa5bb2c35559615d1cc4fd3af5"><code>41ddad5</code></a> (influxdb) - influxdb: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/2006480f82ab4291efa75a69cad0080a29872110"><code>2006480</code></a> (logger) - logger: use redis stream replace nsqd</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/ab23d17f378ea1b740fb4c43dc06f4853d5c729f"><code>ab23d17</code></a> (logger) - logger: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/81d4e9dcde820ab8dc1df6fb99f82fdf39eb35ea"><code>81d4e9d</code></a> (logger) - logger: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c3d9796e21c344d660bfd036d6154c28a3051995"><code>c3d9796</code></a> (monitor) - monitor: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/cd9de3c70c33236975b1d2547b75a66649fba93d"><code>cd9de3c</code></a> (monitor) - monitor: switch to oci charts</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/318a73f7f03c01faa23ce3a89b4b52d5cae4279d"><code>318a73f</code></a> (passport) - passport: add change user confirm</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/79ef1004687152d93a5e60058fd4f40a6273b55a"><code>79ef100</code></a> (passport) - passport: add re login at authorize</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/6927bb5884a7ee332a64afabfd6439467d7fee3c"><code>6927bb5</code></a> (passport) - passport: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3146a0981b744962d68a75fab65e074ab61d4b1c"><code>3146a09</code></a> (passport) - passport: add google reCAPTCHA</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/802abcdd5f0768d75b4fc9f08f46c4b2a590be29"><code>802abcd</code></a> (passport) - passport: add replica database support</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/a0dcd1b7b2bdd3ba247d50fdf554a2918b065588"><code>a0dcd1b</code></a> (passport) - passport: switch wsgi to asgi</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/4c9dbba2b1e79cf9860e19529bd99f52f5588328"><code>4c9dbba</code></a> (passport) - passport: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/74825f7827e22b75938cbcc5bf81ad1a40c4ab37"><code>74825f7</code></a> (rabbitmq) - rabbitmq: add rabbitmq managentment ingress</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/12cf7d60e4e89e3396e786f4487cca55f1322887"><code>12cf7d6</code></a> (rabbitmq) - rabbitmq: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/103417de373246b4f1e0b9cdaf2eaae6ba704dea"><code>103417d</code></a> (rabbitmq) - rabbitmq: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/5d428bbd55c0ec12f6fcafe312b2cd3768fb51d1"><code>5d428bb</code></a> (redis) - redis: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/a88c1a9625757b901515682f39d40a7f5b877f95"><code>a88c1a9</code></a> (redis) - redis: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/541585d4060d6006b99fd3649718566a6ea3163b"><code>541585d</code></a> (registry) - registry: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/e9ca9d475dade575ae13c3b288148b8094faf3f6"><code>e9ca9d4</code></a> (registry) - registry: add garbage-collect cronjob</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ec62a5969747738252132510923637c1b63b63d8"><code>ec62a59</code></a> (registry) - registry: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/fde0b07f243deabc0818efc4088583c6ca6aa5b8"><code>fde0b07</code></a> (registry-proxy) - registry-proxy: switch charts to oci</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/be14eb42fcda99f9160d21f437858e89337543a2"><code>be14eb4</code></a> (storage) - minio: add affinity</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/51af6966183c496c9c1374cf4c4fa9b66f319a44"><code>51af696</code></a> (storage) - storage: add k8s csi support</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/76a75d922b965b8961f872b62c67569924e0cf49"><code>76a75d9</code></a> (storage) - storage: add cluster health checker</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/a17dc8cc37c2c2d96acdbcc08a6c2e52676cb777"><code>a17dc8c</code></a> (storage) - storage: switch charts to oci</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e4f44fba4f4a71812b0a1b0d42668d8a6f3bbc65"><code>e4f44fb</code></a> (builder) - builder: no error return</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e38dfc71c5dfa0edafc5603f274235048a3992d7"><code>e38dfc7</code></a> (builder) - builderControllerHost/ControllerPort init error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ff9069fee85633db4801a43d4fa70292099c94dc"><code>ff9069f</code></a> (controller) - controller: influxdb query error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f7f5069569e3f7325fc8fa5f90f8c19e95c0c6ce"><code>f7f5069</code></a> (controller) - controller: authentication 500</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7e297a8996c9fbf490fcbce364c0b4172bdc6388"><code>7e297a8</code></a> (controller) - controller: add check remote user status</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9db28e1ea4627f8f63dcc6f83db2962dc5b47451"><code>9db28e1</code></a> (controller) - controller: celery MaxRetriesExceededError</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4bcff08d38a01a4d7267fef00650395275e3203b"><code>4bcff08</code></a> (controller) - controller: wrong name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d69fde2efc71b015ae2894fcc3efa0cf369457e5"><code>d69fde2</code></a> (controller) - controller: traefik ingress create error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a3ad743c2ecd0528c5c69915272dc68a90fd841a"><code>a3ad743</code></a> (controller) - fixup(controller: user login error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/662c8ddfbcb03d19f5ced769de21964ff5ed413e"><code>662c8dd</code></a> (controller) - controller: change influxdb port</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/957bdf67128b45abad43e8ee560fb6cb749b0783"><code>957bdf6</code></a> (controller) - controller: validate rsa key pairing before storage</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/419ec4c4de6ad77c9cc3f551260fdc35504ceb15"><code>419ec4c</code></a> (controller) - controller: kubernetes pod/exec cluster role</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a67edaae26c00a7ce806bde95b73041ec1c84734"><code>a67edaa</code></a> (controller) - controller: Cannot routing:disable</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e09e2144f1906b19d9b00f0883effe3491198ebf"><code>e09e214</code></a> (controller) - controller: allowlist cannot remove</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/318b1267f35bcf158fc21b20f8e367a3e23fa454"><code>318b126</code></a> (controller) - controller: domains update error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/92855ebc7df34fb8cc5ea440db4f821681ae2408"><code>92855eb</code></a> (database) - database: premission denied</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/bde945ab972d9085009b291c0faac55d8942b014"><code>bde945a</code></a> (database) - fixup(postgres: support arm, fix Failed to build psutil</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/7854d45a2164a1db8ee37bc3ce39c8515bacae30"><code>7854d45</code></a> (database) - fixup(postgres: user name converted to lowercase letters</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/57b2a0708d5ab8fff913e97be09f132074d1ff56"><code>57b2a07</code></a> (fluentd) - fluentd: ifconfig_path not found</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/20e72b962a415773fd97919832c7a0bde9c55a28"><code>20e72b9</code></a> (imagebuilder) - imagebuilder: upgrade pack version</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/651db8a1d2f40f0fafb88f2da4b6fd20ee920715"><code>651db8a</code></a> (imagebuilder) - imagebuilder: chown uid gid order</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/d2e9164afe61fac362beb65ee9113453c2ecd970"><code>d2e9164</code></a> (influxdb) - influxdb: proxy not running</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/3a1d3618d881880abcd752c9c9184a570b38442e"><code>3a1d361</code></a> (monitor) - monitor: charts naming</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/d754ae0244e6e1e300062db24c8e4477b7522715"><code>d754ae0</code></a> (monitor) - monitor: telegraf init error</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/63f9e346a4ded75b7b4f8f0c6708bbe725ee6160"><code>63f9e34</code></a> (monitor) - monitor: affinity error</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/95ae1e5f51e528b75ccae36ad86e9abfbff52050"><code>95ae1e5</code></a> (passport) - passport: yarn build fail</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3f5365e8e5be0b2a486651e87fb5b82fe4668bbc"><code>3f5365e</code></a> (passport) - passport: wrong name</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/907f17b95c1114a802781f2bbec3ba046464f1a8"><code>907f17b</code></a> (passport) - passport: change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/e3911e0f5e9174ab8e7542f60b8bd0c3ff7f85f6"><code>e3911e0</code></a> (passport) - passport: &lsquo;registration_done&rsquo; not found</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2ace5f0a2a363d959a381bd3f759b4990bc13953"><code>2ace5f0</code></a> (passport) - passport: ui style</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/b3ba1e1545f07ee2322850ee6cfb6915ee26967d"><code>b3ba1e1</code></a> (passport) - passport privacy policy link</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/172e9c8b680a83d6c437292febf0418d35c99aa9"><code>172e9c8</code></a> (passport) - passport: check databaseReplicaUrl error</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/a3aeb7052d4ebdbc7bd020850f94921c253a8a38"><code>a3aeb70</code></a> (rabbitmq) - passport: change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/5c73dcf6a8692e83abd40f1d5e991714b3c51876"><code>5c73dcf</code></a> (redis) - reids: DRYCC_REGISTY misspelling</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/d7e3baf4600d87e4d4af2b3e581cb62c591a25b6"><code>d7e3baf</code></a> (redis) - redis: env miss</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/cadaa9151519a4efb52d5c5f779cc0aff0f8fe1e"><code>cadaa91</code></a> (registry) - registry: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/d524217dccfc6dd80c86547d5f2f875b15a8054d"><code>d524217</code></a> (registry) - registry: storage run error</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/854f912bf746ac69d0117378888c1fe8334dd7fb"><code>854f912</code></a> (registry) - registry: chown uid gid order</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/e642bb7452fb62bbc7ce6f1b852e029b88a71488"><code>e642bb7</code></a> (registry-proxy) - registry-proxy: containerPort error</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/8dfd029b78d2dcd1b6bf31960d35234deb6bfc5b"><code>8dfd029</code></a> (registry-proxy) - registry-proxy: chown uid gid order</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/bbea3642114ac83e3c9cb56e7131146378bbf213"><code>bbea364</code></a> (storage) - minio: premission denied</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/97deba16553dd6dc8d2625d8747825692e8667bb"><code>97deba1</code></a> (storage) - storage: node unimplemented error</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/b9bdeff3ef47f43ec12dd16194297d63298fbd34"><code>b9bdeff</code></a> (storage) - storage: pd can not connect each other</li> +</ul> +<h4 id="style">Style<a class="td-heading-self-link" href="#style" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1edb10c23e5ae5654e6a7daf08b7a74fe9c86b74"><code>1edb10c</code></a> (controller) - controller: database convention over configuration</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1960cc3367aa6b0e8f0db5f0117a271c884356a0"><code>1960cc3</code></a> (database) - database: database name convention over configuration</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/06d1f5dd3b7ff353ae26615695732f54dd09e5c7"><code>06d1f5d</code></a> (imagebuilder) - imagebuilder: URL to Url</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/b8a89412e7794fe9e16689d4e8902d34f68a6ce1"><code>b8a8941</code></a> (passport) - passport: database convention over configuration</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8e9a199ac90382e67f64c757d9d207e7aa106c86"><code>8e9a199</code></a> (builder) - builder: upgrade controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/48401512b2eee6a608efe45c962809a4a388ed9a"><code>4840151</code></a> (builder) - builder: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/68ccfb12da3fdc35519b23fdb8212f7de377f8b5"><code>68ccfb1</code></a> (builder) - builder: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8f971cbd509062f952e0b0fe2fdc9983891077ad"><code>8f971cb</code></a> (builder) - builder: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fe2c55d0e5264818e482fcd71510d9a616689c79"><code>fe2c55d</code></a> (builder) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2b5e70609f11eff1eb1e1d8a5591644799fa8982"><code>2b5e706</code></a> (builder) - dockerfile: change user and workdir</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7a6c8d319bcc67e1cbe5a733de773860aa859765"><code>7a6c8d3</code></a> (builder) - builder: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fe494f75669f9e3a51ff32e330edb8c5a33efed7"><code>fe494f7</code></a> (builder) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/a7c87525709c6903e4fb254740eac710c3e18385"><code>a7c8752</code></a> (builder) - builder: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/eb2e94c2ab4358e74a74c8d198eb6798e9bdeae7"><code>eb2e94c</code></a> (builder) - database: bump mc 2022.04.01.23.44.48</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/cfaae66aa31b4b7b28c7d4577e9bf9c7f17a6716"><code>cfaae66</code></a> (builder) - builder: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d7d289060ddafcc94855bb46dc4fbc24cf1c3527"><code>d7d2890</code></a> (builder) - builder: change default imagebuilder registry</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ecfdb19270198fc3f2b46cc0dc91151bd3ebf114"><code>ecfdb19</code></a> (builder) - imagebuilder: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/6da17f489543950af850ee3d5bb4e1cfbcc5cac1"><code>6da17f4</code></a> (builder) - builder: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1a57e5bd5e467b859e0d69e6b3775454132cb225"><code>1a57e5b</code></a> (builder) - builder: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f1464fa6065483d23b98f01a847b73e951f896ae"><code>f1464fa</code></a> (builder) - builder: <a href="https://github.com/minio/minio/issues/13799">https://github.com/minio/minio/issues/13799</a></li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/b1e1c4f5920ba82235a253f9980960ef9dca527d"><code>b1e1c4f</code></a> (builder) - builder: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/71a41453660c6d731247a10e00f94121ae3a69a5"><code>71a4145</code></a> (builder) - builder: bump go.mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/3567688f8809e3805e47170d4b3109a31b1f883f"><code>3567688</code></a> (builder) - builder: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/73ea38b11c631415aa02c5ee43ff92ecfe48348d"><code>73ea38b</code></a> (builder) - builder: change storage to minio</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1f913215ba18670fe83891bf84317b72985151dc"><code>1f91321</code></a> (builder) - builder: use testify replace assert</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d148b9c998759b886ea5493d0e2aa94518d39dcb"><code>d148b9c</code></a> (builder) - builder: add check storage health</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/b768101f69233fa792f3240be47b71b24881e90c"><code>b768101</code></a> (builder) - builder: change initContainers</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/1b3bec3ea2783c5124f372c2874c3691b71489cd"><code>1b3bec3</code></a> (builder) - builder: add replicas</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5cb0d618ff5bb1136501f4ba6359e5e5c46a7a63"><code>5cb0d61</code></a> (builder) - builder: upgrade to latest controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/98b9d581209eacabdb9e28c5eb6a7975f13bd454"><code>98b9d58</code></a> (builder) - builder: upgrade new require</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/65817c3e519df8368cd4427f5d366f9edde1fbd5"><code>65817c3</code></a> (builder) - builder: change drycc.cc to <a href="https://www.drycc.cc">www.drycc.cc</a></li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4e3f9d05bb8d00023e6f1927785b7c27d4801652"><code>4e3f9d0</code></a> (controller) - controller: add celery retry mechanism</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f6716fee7625ad8f0cad2b1cf5ad746beb847a65"><code>f6716fe</code></a> (controller) - controller: change cronjob name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/eb606938533da2673ed2aa2986bcb0cdd2c9ee2c"><code>eb60693</code></a> (controller) - controller: refine celery task priority</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/66905e95bb3c9f71fb4c75038199d54c6b5a0edc"><code>66905e9</code></a> (controller) - controller: change manager auth</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ea20c415af0ee4e70f32873748cd979bd36f8240"><code>ea20c41</code></a> (controller) - controller: remove start/stop api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4c8fc807f950064d2cc98ebdd6a51ec86eabb20f"><code>4c8fc80</code></a> (controller) - controller: improve tasks error handling</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/cf7402eaff8373c956e6c0ffa1c7ff479cade8e2"><code>cf7402e</code></a> (controller) - controller: add blocklist api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/80f14dd5b8852c235e3de496261b416c8b59a043"><code>80f14dd</code></a> (controller) - controller: use get_user_model replace auth.User</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ffc7bb790f2257f5e5f9902400f78524d1f528e3"><code>ffc7bb7</code></a> (controller) - controller: use JSONField replace ArrayField</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/370df8c9d011e25785a06e5a4a737dcdb622f4f5"><code>370df8c</code></a> (controller) - controller: add validate metric</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/29084ce759bddd671de4441c6f8e6889774e4c80"><code>29084ce</code></a> (controller) - controller: use user id request manager api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/718fe123eafe5136ac08635c8cf1dbca3dcad4ab"><code>718fe12</code></a> (controller) - controller change urlpatterns order</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/71f40426a65bc6cdc90e6185b1487ae30a3c73de"><code>71f4042</code></a> (controller) - controller: measurements uses lowercase letters</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e5123ea55ae516d94b0cb54ec6ffb464c050ce87"><code>e5123ea</code></a> (controller) - controller: change resource unit to number</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/18fee9aeb1114ea8dbcc4d8eacea93148206e002"><code>18fee9a</code></a> (controller) - deps: bump celery from 5.1.2 to 5.2.2 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ffca6c11c67012e13540e06c12cf30dea5e5cde7"><code>ffca6c1</code></a> (controller) - controller: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9ec12e1ff7bcfb3b72953313484d3f605d97c73b"><code>9ec12e1</code></a> (controller) - controller: simplify drone configuration</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4b4749e2fd391a492fbf40fb7ee25c7b61b52f26"><code>4b4749e</code></a> (controller) - controller: set default CSRF_COOKIE_SECURE false</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2ef6338c20c8625b2cc76c6021149bc07141fcd0"><code>2ef6338</code></a> (controller) - deps: bump django from 3.2.5 to 3.2.10 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c7570d0a40f7daa04de0a4fe1ecbb001e436ee41"><code>c7570d0</code></a> (controller) - deps: bump django from 3.2.10 to 3.2.11 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8b17bc16624fd9caddbbc462cc3487d3500a5216"><code>8b17bc1</code></a> (controller) - controller: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c928fb09f88ce210df7b495b80a005146320e2bf"><code>c928fb0</code></a> (controller) - controller: use rabbitmq cluster</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f9171852a8530c9bd385576517d24172917a1b33"><code>f917185</code></a> (controller) - controller: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/22a8f634a3574553132ecd53e8be467d84a255e9"><code>22a8f63</code></a> (controller) - deps: bump django from 3.2.11 to 3.2.12 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3cc3b00a705b9c7b0ff5d36fb2c0ab4139113dd9"><code>3cc3b00</code></a> (controller) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ee274f6d6728b3b9b3fd91b344be3f8a0d3f737f"><code>ee274f6</code></a> (controller) - controller: set venv profile</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ce6b069644ed3952a47bdd1bd728a395a9f1af05"><code>ce6b069</code></a> (controller) - controller: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3a105d3628e40e2f53dfd2badeb7221555207227"><code>3a105d3</code></a> (controller) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/15f9b0ea96630a818ec191dac15497a5dc99cadc"><code>15f9b0e</code></a> (controller) - controller: code review</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/01e6fd9ef5d730749a33986ff9d58dd854f50cb5"><code>01e6fd9</code></a> (controller) - controller: use passport user id</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/893ee31a1de6036136d0b813d5ff6575267e640a"><code>893ee31</code></a> (controller) - oauth2: update user info pipline</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3028fb470f23d858a5e36312e419dcdfbcc00be0"><code>3028fb4</code></a> (controller) - user: set AnonymousUser username</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5daf82d3bd17f2c653d2db52fb79d2a895ed1335"><code>5daf82d</code></a> (controller) - controller: set worker_cancel_long_running_tasks_on_connection_loss</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/61f2c53a7841099e33c8d5f8d25de311392ce317"><code>61f2c53</code></a> (controller) - controller: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/88feb1df0f3508c29a47ea291f225207a8a4c754"><code>88feb1d</code></a> (controller) - imagebuilder: python=3.10.4 rabbitmq=3.9.14</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/914e03fb8d6d6bff7ef9b5f91b0a3eeedac2ebeb"><code>914e03f</code></a> (controller) - controller: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a5bb548ee73cd201cafe797fdba4fe89e4bbb377"><code>a5bb548</code></a> (controller) - controller: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3ecdd7c05b7cddd640ffe92012b777a80cae1eec"><code>3ecdd7c</code></a> (controller) - controller: add a separate rabbitmqUrl configuration</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/967cb116bdbbf040c3c3c15579bb2d334666d3e8"><code>967cb11</code></a> (controller) - controller: remove APP_STORAGE</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/473d2b5f08c205240b5e081fcb9256d7ecd4cd45"><code>473d2b5</code></a> (controller) - controller: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e410d4cba17662bad797fbd7288052b81e50df29"><code>e410d4c</code></a> (controller) - deps: bump django from 3.2.12 to 3.2.13 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c6ef777035d5e955984f9f4c84fac465943d8b74"><code>c6ef777</code></a> (controller) - controller: simplified passport config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0fd3233f1471b32c621149ac4ca5b5527741fda8"><code>0fd3233</code></a> (controller) - controller: remove settings hardcode</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a64e99cf099eba92c6df749c3c89f4245488b3e4"><code>a64e99c</code></a> (controller) - controller: change passport config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/62aba2594f1240c4368d95c61d75fa08343d05fb"><code>62aba25</code></a> (controller) - controller: set cronjob timezone to utc</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/760b70b635d6eecedfd3d40991740b13e587c1c5"><code>760b70b</code></a> (controller) - controller: change default ratio</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8dffc3afbce3871dc82fe4ce94c92b1fbbacc9b6"><code>8dffc3a</code></a> (controller) - controller: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/26043c40c89cb162b3ce322eba6a79f81a6b24cf"><code>26043c4</code></a> (controller) - controller: change default app storage</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/608bd8da7a7cb75d8fadfa965bcd9ea32e4a96ef"><code>608bd8d</code></a> (controller) - deps: bump django from 3.2.13 to 3.2.14 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/18ed0c2a656497108f98c5c8dbd3b27253dd7915"><code>18ed0c2</code></a> (controller) - controller: remove conjob affinity</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/add671288d5f4af68735a69771f024e4ed856196"><code>add6712</code></a> (controller) - controller: add volume expand support use patch</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/cc1ad1322ba638aa7f6acf45823047712a85e86f"><code>cc1ad13</code></a> (controller) - controller: add startupProbe</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0e9a6033b1a2b66f937010601df70e5625674a66"><code>0e9a603</code></a> (controller) - controller: add clearsocial cronjob</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/eb6f05d969102c008051ebd4c7e39a1300ed1b25"><code>eb6f05d</code></a> (controller) - controller: change initContainers</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/762c6767947b6407a7fb23ffbcb07dc46154b222"><code>762c676</code></a> (controller) - controller: change replicas</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/abd7e8c2210eb1f71c1d280383794af5fa786c98"><code>abd7e8c</code></a> (controller) - deps: bump django from 3.2.14 to 3.2.15 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/07fdf1b9938d868ef55c1d2067258a1eb6c59d23"><code>07fdf1b</code></a> (controller) - controller: remove database conn_max_age</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ef8e41f523aa0159831c95623b96fa74b3570d0c"><code>ef8e41f</code></a> (controller) - controller: add database replica check</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/79143f2301bfc52f8181fc0e0f07263645e065d8"><code>79143f2</code></a> (controller) - controller: upgrade new require</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a62404890973cb26c9360878e7625e15eb87d281"><code>a624048</code></a> (controller) - controller: add app.refresh func annotation</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b22d367d54aa2ab131c8e69491e084dc283826a4"><code>b22d367</code></a> (controller) - controller: optimize app refresh timing</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/fe98f0c8f3d2cfebc2b6ad13927627ebee96e39e"><code>fe98f0c</code></a> (database) - database: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/5e00c118e5830c43158417486b83602d1e9839ff"><code>5e00c11</code></a> (database) - database: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/d2cb8607a95e098fe0c50a82ebadd3393a52cd56"><code>d2cb860</code></a> (database) - database: disable huge_pages</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/197d80d95e42443351abbf1aae216d5f80073334"><code>197d80d</code></a> (database) - database: add persistence</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1c3e64596ee5970c3ef7a1daeee86ced68ae3ec1"><code>1c3e645</code></a> (database) - database: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/37730ab6ca7ac86728f9fe0f1c41240402abb9bc"><code>37730ab</code></a> (database) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/5014112dd279d1e3a8d5b6fa23797d0996fb2047"><code>5014112</code></a> (database) - dockerfile: change entrypoint</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/29b538e8b33cd19bb3a781abb8335905fa7a533f"><code>29b538e</code></a> (database) - database: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/c2bb0746172d4dc764cd8543d98bb6cbd9205cf9"><code>c2bb074</code></a> (database) - database: bump python 3.10.4 and mc 2022.04.01.23.44.48</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/077a4e95b2ee3d772e030971218e880f31a55e4c"><code>077a4e9</code></a> (database) - database: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/560bdb97a46897ae0fd464ca6e2b54d129d91b37"><code>560bdb9</code></a> (database) - database: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/1e54b554f4a29df49ac42ba046f00f71a105f84e"><code>1e54b55</code></a> (database) - database: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/d6466723b4f949a4771d7415f1a80924f398963d"><code>d646672</code></a> (database) - database: <a href="https://github.com/minio/minio/issues/13799">https://github.com/minio/minio/issues/13799</a></li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/a6ac4e350fec8e27c1bdc560130c585d3a7ab7d2"><code>a6ac4e3</code></a> (database) - database: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/9618d87f3bc63c8933553278e88c7d6758b9e2af"><code>9618d87</code></a> (database) - database: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/b8232737ff893b064a558821da49b40905b4e83d"><code>b823273</code></a> (database) - database: change minio to storage</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/7bd5a90fe97b9b0ec20f5305431891f10a975c61"><code>7bd5a90</code></a> (database) - database: add check storage health</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/20c6d96e16b2dc7fc7d1bf75a8b44dd6ca459f6f"><code>20c6d96</code></a> (database) - database: fix storage run error</li> +<li><a href="https://api.github.com/repos/drycc/database/git/trees/8bde83071df44a11b01ae13fbe2676567780170b"><code>8bde830</code></a> (database) - database: upgrade to pg 14.5</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a33b5e5ef09bfc8cf5fbf79fd11dee4766a910e2"><code>a33b5e5</code></a> (fluentd) - fluentd: update plugins</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/eed7a7804b91dba5c31762adcf1245950365b4fe"><code>eed7a78</code></a> (fluentd) - fluentd: update filter kubernetes setting</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/cc83dd87809f1b71e18636240582c0a58eb73ad2"><code>cc83dd8</code></a> (fluentd) - fluentd: update elasticsearch store setting and support exclude specific container logs</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/ba2feb28bc7a96ec2a0632c5c4070d5300de3c37"><code>ba2feb2</code></a> (fluentd) - fluentd: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/d528676b75699d731ceba78ca7b207bd1472aed6"><code>d528676</code></a> (fluentd) - fluentd: simplify drone configuration</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/dece82d3a85c2b69d4315d324d03fd1f523e53fa"><code>dece82d</code></a> (fluentd) - fluentd: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/4e0a80244c190607f9e706fdeed0f3829c505a76"><code>4e0a802</code></a> (fluentd) - fluend: replace nsqd with redis</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/15ceca0cdbfb56e03b96cfd96e9b13909667f2e3"><code>15ceca0</code></a> (fluentd) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a7f619f70d0fb77d08f544dc593d033396b984af"><code>a7f619f</code></a> (fluentd) - dockerfile: change workdir</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/9adf5ed9a2387c79a596a4e8fddcc099316e9fd8"><code>9adf5ed</code></a> (fluentd) - database: bump fluentd 1.14.6</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/50c14c28eb1f3c673787b1f59f6b713995cd1441"><code>50c14c2</code></a> (fluentd) - fluentd: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/83171b1e36a4fc787459ffdceb9a2573b518a287"><code>83171b1</code></a> (fluentd) - fluentd: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/ec8358165e029e7c82316877f629b128bb3a00f7"><code>ec83581</code></a> (fluentd) - fluentd: unified reids declaration</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/07c63e24a3760a0604d3c17936690f31380e7b8c"><code>07c63e2</code></a> (fluentd) - fluentd: upgrade fluentd 1.15.2</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/65df9be7b31a93f6ea30d259cb13cf0401d78234"><code>65df9be</code></a> (imagebuilder) - imagebuilder: update pack version</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/66cab351e53388cdb2bddf4f415240883c3217f9"><code>66cab35</code></a> (imagebuilder) - imagebuilder: use dind replace go-dev</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/0c8206098ba01f01039c1b563238a6612e6a1fed"><code>0c82060</code></a> (imagebuilder) - imagebuilder: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/8146da94bfef611398b03c70be316676aa49f626"><code>8146da9</code></a> (imagebuilder) - imagebuilder: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/7d97241d42a0282255d9c1d6a823159671f25fd4"><code>7d97241</code></a> (imagebuilder) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/07e805c48d9f9ccf44e23d91791995f38fa28345"><code>07e805c</code></a> (imagebuilder) - imagebuilder: change default buildpack</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/8d1038df7e714b72d43b491a3fddb36639736937"><code>8d1038d</code></a> (imagebuilder) - imagebuilder: upgrade podman to 4.0.1</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/62d3687a1edeefee68d5fedfb59eea38e791a3f7"><code>62d3687</code></a> (imagebuilder) - imagebuilder: change workdir to /workspace</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/da8bfb0f576bc292eb6427f7945271cc00fcb0ce"><code>da8bfb0</code></a> (imagebuilder) - imagebuilder: change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/d44e3bc2007f4e70c7dfa6d59279e7643345bd46"><code>d44e3bc</code></a> (imagebuilder) - imagebuilder: upgrade stack</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/5b0c7e69839ac408230bc142a2ba42953a068216"><code>5b0c7e6</code></a> (imagebuilder) - imagebuilder: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/f74cbf6113d99064c5b734da329980434c4f854a"><code>f74cbf6</code></a> (imagebuilder) - imagebuilder: add defaultBuildpacksURL</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/941d4939323573679841cc114669e1dec2154f94"><code>941d493</code></a> (imagebuilder) - imagebuilder: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/449be91d0c64e4e7947de68c4e35fcfd8a944a14"><code>449be91</code></a> (imagebuilder) - imagebuilder: <a href="https://github.com/minio/minio/issues/13799">https://github.com/minio/minio/issues/13799</a></li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/63b052341db3e1dcd2458ded7be233ec9877a3bf"><code>63b0523</code></a> (imagebuilder) - imagebuilder: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/4e8a6e570108c8db393c764bd6cfa8f66cb126c7"><code>4e8a6e5</code></a> (imagebuilder) - imagebuilder: add imagebuilder config</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/2d891f53998f135bc91c34ff1e80189e01969ab5"><code>2d891f5</code></a> (imagebuilder) - imagebuilder: change minio to storage</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/addceda27e7416c7e75d7502265448a95377ed4d"><code>addceda</code></a> (imagebuilder) - imagebuilder: upgrade new require</li> +<li><a href="https://api.github.com/repos/drycc/imagebuilder/git/trees/a6e569fdfaf379bb7c64c32e2406ecbb61ad890f"><code>a6e569f</code></a> (imagebuilder) - imagebuilder: pack_build add &ndash;env-file parameter</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/6191ff5c4cc132b0a5f9bf4bc227f8a64ed0c327"><code>6191ff5</code></a> (influxdb) - influxdb: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/dc3f8c7ed955953e4b576111edde4f05726a86cb"><code>dc3f8c7</code></a> (influxdb) - influxdb: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/6b5c81922dd498c0abb22e44ff85226881df187f"><code>6b5c819</code></a> (influxdb) - influxdb: new ingress style</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/68b381d1f377bdd805d4db86fb244ece080851bc"><code>68b381d</code></a> (influxdb) - influxdb: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/ea20eb81c27c90d8038872a9b5517ea1a7eafb8f"><code>ea20eb8</code></a> (influxdb) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/64c0a71ef6d0139d8c8df6b8823f53d444df1adf"><code>64c0a71</code></a> (influxdb) - influxdb: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/a709ca19e2ee8a37f9f46263a714aea85e413391"><code>a709ca1</code></a> (influxdb) - influxdb: use DRYCC_UID DRYCC_GID env</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/740dff00afe4b6b207d3e64819745702861e7b8b"><code>740dff0</code></a> (influxdb) - influxdb: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/e0356737f548edc85730aecbbf3ac402ef0fc3a0"><code>e035673</code></a> (influxdb) - influxdb: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/f1cefbd0b3107e5a4a228cce55e580eda0a6e849"><code>f1cefbd</code></a> (influxdb) - influxdb: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/a00100ebf6f1f8ee29d0341689823be68297a9f6"><code>a00100e</code></a> (influxdb) - influxdb: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/9d165ef2cf43f2abceba893a883e34285e694cb3"><code>9d165ef</code></a> (influxdb) - influxdb: add probe</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/bee7fff49a4c9410c5ccae1f3a2435ac0b505e82"><code>bee7fff</code></a> (influxdb) - influxdb: upgrade to influxdb 2.4.0</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/254914c02d7bd968e52586a52b8749d5b3fb6388"><code>254914c</code></a> (logger) - logger: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/8d91c68965c76c955300ec0f2e583020c14465e7"><code>8d91c68</code></a> (logger) - logger: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/b6d21828ed8355c658716f9684c7dee4c73a964f"><code>b6d2182</code></a> (logger) - logger: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/c35e59a79f6ccd9946db9979abb9f5125c899695"><code>c35e59a</code></a> (logger) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a63c07029db0b5f7ec7dc38f4f60489956944475"><code>a63c070</code></a> (logger) - logger: change workdir to /workspace</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a594b28985d601c0289deedef07ac09ccd58a1f4"><code>a594b28</code></a> (logger) - logger: set gid uid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/9a90e22cac7243e36d88d33f95369a7a5b0a5baf"><code>9a90e22</code></a> (logger) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/36493b41b11e8847d578dd9563d581bf25adcb2e"><code>36493b4</code></a> (logger) - logger: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/897a3a5a77ea96250b76bcf06274179c85549c86"><code>897a3a5</code></a> (logger) - logger: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/03b32ab19cd49ddeb966682fe5e7dd4c3b34235e"><code>03b32ab</code></a> (logger) - logger: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a50ba5fcd9ef8205a1b5064789735241b5ece4b8"><code>a50ba5f</code></a> (logger) - logger: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/23187a3fe6e2ffe2d4fc38a705e72c14a85fbb67"><code>23187a3</code></a> (logger) - logger: unified reids declaration</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/aaa129ade36389917750e10389b3274331caf03a"><code>aaa129a</code></a> (logger) - logger: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/be4f65615f0735303f9be4f9d67158979741b395"><code>be4f656</code></a> (logger) - logger: add replicas</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/7c25459be3cb002ea933a47e9ec318d20d69616b"><code>7c25459</code></a> (logger) - charts: add NetworkPolicy</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6810149b5d3d6199c69909374a72836287f66b9e"><code>6810149</code></a> (logger) - logger: remove memory storage</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a918c50d5294d3ac8bd6d156d0a63ecd373ba72c"><code>a918c50</code></a> (logger) - logger: add .vscode to .gitignore</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/a41521029d715d227582cb00edc64953028f5983"><code>a415210</code></a> (logger) - logger: add log follow support</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/59b1da3a3172da80b3b16205a6dc420a79208450"><code>59b1da3</code></a> (logger) - logger: upgrade new require</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/27cc151c73ef774d4799e04431748bdd8ffbeea5"><code>27cc151</code></a> (monitor) - monitor: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/07d6a9dff96571e1445fb04da374935062fa18e0"><code>07d6a9d</code></a> (monitor) - monitor: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/105435759e1f9250aaf0e7c0ea8d5b34aa2e0a76"><code>1054357</code></a> (monitor) - monitor: use redis default port</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e3673dfa93515ecd8507a00b2081ab7749091038"><code>e3673df</code></a> (monitor) - monitor: remove nsqd</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/fc9dd3ed61d7990e451af7b28d7691a6a0557e28"><code>fc9dd3e</code></a> (monitor) - monitor: new ingress style</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/856a898d34a21c18479f11c20926621bcb75894d"><code>856a898</code></a> (monitor) - monitor: add default user env</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9857535c0cdb43253706d3f6d47d15fd0cc592cd"><code>9857535</code></a> (monitor) - monitor: add random user</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/38b5a040f4617782597abd1ed63f2ac732c64bb8"><code>38b5a04</code></a> (monitor) - grafana: oauth auto login</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/5dfc5797cc291d2a6387713989bc0eb5c130127b"><code>5dfc579</code></a> (monitor) - monitor: upgrade version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e121b5a7844ed76b7cca01a89c0cfdbc36438487"><code>e121b5a</code></a> (monitor) - monitor: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/84462a03ead9ebc1addf53ede3089f4abb0db1f0"><code>84462a0</code></a> (monitor) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/b9e8ce8c0775c6ce6725200ca8639b372a91bbe9"><code>b9e8ce8</code></a> (monitor) - monitor: chore(imagebuilder): change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/05ee8abd8e44a731e070c6417b00f9a777649c22"><code>05ee8ab</code></a> (monitor) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e1fa68e170a1b4c8a1fd6ee67d211cb023cb6963"><code>e1fa68e</code></a> (monitor) - monitor: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/b8f302b73ef2f71f53d3c165db6ca0f9d446e294"><code>b8f302b</code></a> (monitor) - monitor: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/4fc991f9be7d47ea1a029d57bbc8c7fb3c80bd5d"><code>4fc991f</code></a> (monitor) - database: bump telegraf 1.22.0 and grafana 8.4.5</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/21a2f6a6b23f23308d50f97ad99b9164919ff5b8"><code>21a2f6a</code></a> (monitor) - monitor: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/acc976f8c3a834f511cb482de03b0e6473de855f"><code>acc976f</code></a> (monitor) - monitor: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/62d76c13d28d136aba544749a837426f3317a794"><code>62d76c1</code></a> (monitor) - monitor: unified reids declaration</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/b3c57ad982406161ef60f04442d4dd9cee91b5b1"><code>b3c57ad</code></a> (monitor) - monitor: optimize oauth2 configuration</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/70af6b07c4c724fbd3070776f4863bffb381d549"><code>70af6b0</code></a> (monitor) - monitor: change passport config</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/69f9a888501b560c698bc6781a80752180f86f04"><code>69f9a88</code></a> (monitor) - monitor: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/2fb278f0ce0d7b9d606b04a4afc297ce44c146f4"><code>2fb278f</code></a> (monitor) - monitor: rename influxdb port</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/17548ffc21f7e10499c535c55ffb413f28576727"><code>17548ff</code></a> (monitor) - grafana: update dashborad</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/69d7bbda0547bae588e01dbcf167d31dfc7debfe"><code>69d7bbd</code></a> (monitor) - grafana: influx dashborad disk size</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/75db1b021bdd974f23f769ae69c9e33aed420d6e"><code>75db1b0</code></a> (monitor) - monitor: upgrade new grafana/telegraf</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/80504a1bb18cfd20493406dccf01e0de1b83713e"><code>80504a1</code></a> (monitor) - grafana: update influx and redis dashboard</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f7078cba8022651a395db8484be72ca8156556dd"><code>f7078cb</code></a> (monitor) - monitor:chown use env</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/91ae0ddb94a172421923af2b63918b051bc65695"><code>91ae0dd</code></a> (passport) - passport: optimize login display</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2d3bbbca40f25656872268f3862f71047f861349"><code>2d3bbbc</code></a> (passport) - passport: change drycc logo</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/59790a747eb6bf83345b57dbd3b27d23b760d48e"><code>59790a7</code></a> (passport) - passport: make user email unique</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/faea034774c19cfac3e5858262600cf1842601ed"><code>faea034</code></a> (passport) - passport: use strtobool</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/1fbf2bc2ce25b003a4f424efeeb67a54408b7744"><code>1fbf2bc</code></a> (passport) - passport: use yarn replace npm</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/119cac8f95d371bc51803dd482d9195460e1ede3"><code>119cac8</code></a> (passport) - passport: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/cff5062a2d8acc931c7a88d3afb7b7b8effd2642"><code>cff5062</code></a> (passport) - passport: set default CSRF_COOKIE_SECURE false</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/9cc021077c3f4f3992727c6661ac758bc8f9e60d"><code>9cc0210</code></a> (passport) - passport: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/9ab38969eff6a8bc8b33166ccd5352b0158e5c17"><code>9ab3896</code></a> (passport) - passport: new ingress style</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/259ccc91b805ed463ff0b0889a58debd78214fc2"><code>259ccc9</code></a> (passport) - passport: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/af1bbcdce7c677597c9647b27e96a1e3fcde7f5e"><code>af1bbcd</code></a> (passport) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/9ae5373f0ce8d6ec3a3f2f2915c9e6b08ca1a025"><code>9ae5373</code></a> (passport) - passport: set venv profile</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/8f610901ad7f5aa175433c2c160076cd0bcc3a15"><code>8f61090</code></a> (passport) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/fcaf72dc9e5f196dc671a8a887ac33dcc4e1b5e2"><code>fcaf72d</code></a> (passport) - passport: upgrade npm package</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/546dcd5b8d668635ada247c7f44d95c0a001bac9"><code>546dcd5</code></a> (passport) - passport: add license</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/4bda2d661883876248c0dd0211fe15551c888c56"><code>4bda2d6</code></a> (passport) - passport: use minify</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/73b0fd135a91bf0e5c6238a659b0e41a5603d179"><code>73b0fd1</code></a> (passport) - passport: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/278fe7a321f4a8561094d0cd8789918a1fd9a5fa"><code>278fe7a</code></a> (passport) - passport: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3cd93d36d49972d4c87fc6fc7cbf38c8b6bd8a1b"><code>3cd93d3</code></a> (passport) - passport: add reactive</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/370b493ccac77e04b1366b4037e9fa7f46d4fda1"><code>370b493</code></a> (passport) - passport: add footer</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/483cbd6ae503b4a3116b673272526a842cd1dcff"><code>483cbd6</code></a> (passport) - passport: use h_captcha replace re_captcha</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3d1675e2af62a5c858b1ae28385af97257c140d8"><code>3d1675e</code></a> (passport) - database: bump python 3.10.4 and node 16.14.2</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/86a783592e559b0a13d2cffcbea6bb4dd7e33684"><code>86a7835</code></a> (passport) - passport: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2d65355b89a12658a69fad874add357378aedf83"><code>2d65355</code></a> (passport) - passport: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/90c1444d2f1f45658fe5a51f406ca58485eb251c"><code>90c1444</code></a> (passport) - passport: unified reids declaration</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2e0e417f1ce86eff2c4d4f35bf5c40e230382cb8"><code>2e0e417</code></a> (passport) - passport: fix firefox footer</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/ad274bed8c36be339d461c657403070abbb695c6"><code>ad274be</code></a> (passport) - passport: use bulecss</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f986d8b3a47d9fd83831fece5000189b1ca82dfc"><code>f986d8b</code></a> (passport) - passport: add main footer</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/3e528676fed3aae01fedbc1be39bcab7e997f088"><code>3e52867</code></a> (passport) - passport: dynamic settings for vue</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/38adabc356280f02d3cc048bd00b8ec1be8d91a8"><code>38adabc</code></a> (passport) - passport: change passport config</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/f8d6b604a6009be7b04d4b97d3457dcc0ba1b697"><code>f8d6b60</code></a> (passport) - passport: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/2cbd79daaeb948f274552e897acd53d0bddefb69"><code>2cbd79d</code></a> (passport) - passport: remove database conn_max_age</li> +<li><a href="https://api.github.com/repos/drycc/passport/git/trees/712279768f9c4dee75e5f0f6f6a1ab0865d5e701"><code>7122797</code></a> (passport) - passport: change drycc.cc to <a href="https://www.drycc.cc">www.drycc.cc</a></li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/8cc84cdb7717cc5a50353f7c32e745725c4c5973"><code>8cc84cd</code></a> (rabbitmq) - rabbitmq: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/f35930fb57b5a0b15c82be2f09879de46bd027e7"><code>f35930f</code></a> (rabbitmq) - rabbitmq: add rabbitmq cluster support</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/fbfa3ba8ff88b80d736ae2dee02575d43754529e"><code>fbfa3ba</code></a> (rabbitmq) - rabbitmq: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/ca607015c53dbf68bcdfe636ff46ce17cb973a01"><code>ca60701</code></a> (rabbitmq) - rabbitmq: use volumeClaimTemplates</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/fe5d1b41f48a729f1ada17ddaec4fd738d2c5c26"><code>fe5d1b4</code></a> (rabbitmq) - rabbitmq: add sharding support</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/9c4ab976e148b46d7fb2ba218254bb4cb8789152"><code>9c4ab97</code></a> (rabbitmq) - rabbitmq: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/348a88a95bad2b93971805ae9563555bfbd4ab00"><code>348a88a</code></a> (rabbitmq) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/2388be18e4d23623cc5b461a31f4dbc13562762f"><code>2388be1</code></a> (rabbitmq) - rabbitmq: upgrade erlang to 24.2.2</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/db2eaa5fac326200594c9768a6e6ce85721a8cea"><code>db2eaa5</code></a> (rabbitmq) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/772afd1f7ed5732355bb9af28018d542d0c6e837"><code>772afd1</code></a> (rabbitmq) - rabbitmq: change to wait pid file</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/2bfc25ec33619c1b10be7639c819c8c2f383bbaf"><code>2bfc25e</code></a> (rabbitmq) - rabbitmq: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/11d505ea19d520d98f74457054dfdbe9e91a98fc"><code>11d505e</code></a> (rabbitmq) - rabbitmq: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/69d63f1c0ce2ed2a0a80945582db041e5dd7bb7e"><code>69d63f1</code></a> (rabbitmq) - database: bump erlang 24.3.3 and rabbitmq 3.9.14</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/838029926101907d9da255e2cbcabc97dd1b0dba"><code>8380299</code></a> (rabbitmq) - rabbitmq: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/b3f69f14a151124887f49a9c4740905221d8f65a"><code>b3f69f1</code></a> (rabbitmq) - rabbitmq: add check rabbitmqLocaltion</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/5327c76d66cb6339d68036aeff52f13f315ca4f0"><code>5327c76</code></a> (rabbitmq) - rabbitmq: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/5c66b5a74037aa530ed84203c153a7d83f2ba6cc"><code>5c66b5a</code></a> (rabbitmq) - rabbitmq: change probe</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/27bebf99a4fac504dc3e4a2a8d395cc5c23c9ff4"><code>27bebf9</code></a> (rabbitmq) - rabbitmq: add start-rabbitmq script</li> +<li><a href="https://api.github.com/repos/drycc/rabbitmq/git/trees/86ee6a780841f4f4927aa4dc6bbc50362fc5f5a0"><code>86ee6a7</code></a> (rabbitmq) - rabbitmq: upgrade to rabbitmq 3.10.7</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/1f29683eb9630822c50687276941bf10b2e1c014"><code>1f29683</code></a> (redis) - redis: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/a5041fc911aa86b277f3577949637f090d7d0488"><code>a5041fc</code></a> (redis) - redis: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/64468c2257c828e61d183d4680b632ea0a24021e"><code>64468c2</code></a> (redis) - redis: add redis persistence</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/de5d7538e64ec86c2d7393dfab922dfe66d29bde"><code>de5d753</code></a> (redis) - redis: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/f6446395fbf46fd644ce3b12a3b5996e7a5b66a2"><code>f644639</code></a> (redis) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/98051d20ecb8f946c8e5093b50791df77494da52"><code>98051d2</code></a> (redis) - redis: premission denied</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/bcb548eca8ae83d1f828bd47e190b6f78a919635"><code>bcb548e</code></a> (redis) - dockerfile: use uid gid</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/524aa412e589ed21c61e31ad03067f8b96a0e116"><code>524aa41</code></a> (redis) - redis: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/26c946651e503cf3be26225010fcf67a646e8c27"><code>26c9466</code></a> (redis) - redis: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/b67d7a25db6484862676b57d89530f5de4cd254e"><code>b67d7a2</code></a> (redis) - redis: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/839ec50c7c473dcac3fc2fb7e0a51a3493b3db62"><code>839ec50</code></a> (redis) - redis: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/237ca86c239a392e23ce9b7ce68bcf9d1d0da27f"><code>237ca86</code></a> (redis) - redis: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/bdd968d27a01a06110ac394fcb4f7893cfb0edc1"><code>bdd968d</code></a> (redis) - redis: upgrade neew require</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/8b2910f10b7f5b6da8828bf8558f4eb373fcc238"><code>8b2910f</code></a> (registry) - registry: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/eedbe78543bf04298134ee2900b21d9218fd99e5"><code>eedbe78</code></a> (registry) - registry: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/024161578b010ad70702ae9480cb07a9b210ca61"><code>0241615</code></a> (registry) - registry: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/9b58da4298fd28f3ca060ce2ffd11a0977b755e1"><code>9b58da4</code></a> (registry) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ab6acb71f85990865cd4322ef21e3d2ae0903ac8"><code>ab6acb7</code></a> (registry) - registry: change workdir to /workspace</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f368bf7d7dfb8357acc8bf5019d052057dba393e"><code>f368bf7</code></a> (registry) - registry: use DRYCC_UID DRYCC_GID env</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f4b9041f9c18721dcfc71091a89145323c5fc092"><code>f4b9041</code></a> (registry) - registry: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/c2e87ca32c58633e9f86b3422d48249b3c1d81a8"><code>c2e87ca</code></a> (registry) - registry: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/feb6aba75f16044ecd927e020372338cd6ddf519"><code>feb6aba</code></a> (registry) - database: bump mc 2022.04.01.23.44.48</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/956932b04720266b896c0ea150a595c77a513444"><code>956932b</code></a> (registry) - rregistry: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/deda8d8d7868938fa890b5e7a0f22911e7151837"><code>deda8d8</code></a> (registry) - registry: move registry-secret.yaml from workflow to registry</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f52c7bf6e4bc23d4f7b4e78224ff2d8da81198bc"><code>f52c7bf</code></a> (registry) - registry: change python-dev registry</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/007fe03a89f5e3b6d9baeda0b3fea84041a46ea4"><code>007fe03</code></a> (registry) - registry: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/d620c6db554f29b6c9b044c12b5dfd62194f274b"><code>d620c6d</code></a> (registry) - registry: <a href="https://github.com/minio/minio/issues/13799">https://github.com/minio/minio/issues/13799</a></li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/85e6b732126ea2dacb4db0d79b2fbb831b0d984a"><code>85e6b73</code></a> (registry) - registry: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/6a1155d75f7d6007f7ef3fe2c947423567c20e65"><code>6a1155d</code></a> (registry) - registry: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7b8ebae5738c401580391a631757fa4646a31f3c"><code>7b8ebae</code></a> (registry) - registry: change minio to storage</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/13389519866129557fe9e08b446eb3a3de163a71"><code>1338951</code></a> (registry) - registry: add check storage health</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/2fa769dcfb770b1f9789e3ab13f96380f3e708c6"><code>2fa769d</code></a> (registry) - registry: change probe</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f187cbf22c9206693656df844e2f97007dd95574"><code>f187cbf</code></a> (registry) - registry: add replicas</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/09d8a7b3cc69d6e0f90ab19b727f54b7129a3ae5"><code>09d8a7b</code></a> (registry) - registry: upgrade to mc 2022.08.28.20.08.11</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/4b187b8d076ef387b667e0807081021184c1f55f"><code>4b187b8</code></a> (registry-proxy) - registry-proxy: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/29ffbbe58737a14432a69938c69ff54c056b7f85"><code>29ffbbe</code></a> (registry-proxy) - registry-proxy: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/6d783baa4be1de057980040830fd6d3b161347a8"><code>6d783ba</code></a> (registry-proxy) - registry-proxy: remove use_cni</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/8cf05cff7cb44bf0b0f5c94e76567607d2f9adef"><code>8cf05cf</code></a> (registry-proxy) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/090e28647345560182a8f21da8f9445d567e3c73"><code>090e286</code></a> (registry-proxy) - registry-proxy: chore(imagebuilder): change uid gid to 1001</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7cf6120e818b9a12799a305d8d17dfef8746a9b1"><code>7cf6120</code></a> (registry-proxy) - registry-proxy: use DRYCC_UID DRYCC_GID env</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/3a00697ed5de2230fc98971798d16de4ac6ceccd"><code>3a00697</code></a> (registry-proxy) - registry-proxy: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/30e69e8ca26894cc9efcd206665c5d96aa198085"><code>30e69e8</code></a> (registry-proxy) - registry-proxy: add registry basic auth proxy</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/942abce928797f2a77883f3a6a1a6720a6774c34"><code>942abce</code></a> (registry-proxy) - registry-proxy: upgrade to nginx 1.23.1</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/5ea3297285ab826c6686bcd20c34b1dd178615f6"><code>5ea3297</code></a> (storage) - minio: use exec runner replace docker runner</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/8306addad83bf486ae0d796d85b8f5593ca22ef7"><code>8306add</code></a> (storage) - minio: canonical charts naming</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/c917e9f3e1b03d0c9557f41f753c05f5d48f60df"><code>c917e9f</code></a> (storage) - minio: provide any additional service annotations</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/042c73208b255364db2cc08374a7b9ba39946edf"><code>042c732</code></a> (storage) - dockerfile: use drycc/base image</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/7b47b82f903ecd1e6f6c1a30ed856f7153eaef20"><code>7b47b82</code></a> (storage) - minio: change workdir to /workspace</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/6f3531ef29ed032f3f0bcbc09211e9030a02340a"><code>6f3531e</code></a> (storage) - minio: use DRYCC_UID DRYCC_GID env</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/9795fb1c71641cd106dc06abeb355c8479b0a351"><code>9795fb1</code></a> (storage) - minio: use common affinity template</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/a7b09c5b264fa9ce068ae06b12ac5fec6e7a63d4"><code>a7b09c5</code></a> (storage) - minio: change nodes to pod affinity</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/76073428fa40f6048482594720707c1e92ca17d5"><code>7607342</code></a> (storage) - database: bump mc 2022.04.01.23.44.48 and minio 2022.04.01.03.41.39</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/ea2b2f15ffc2c4d263e537aa14a74f9c71a450cc"><code>ea2b2f1</code></a> (storage) - minio: use registry.drycc.cc replace docker.io</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/445b50100629f5799b4137fa5d71a4768836f8d2"><code>445b501</code></a> (storage) - minio: <a href="https://github.com/minio/minio/issues/14331">https://github.com/minio/minio/issues/14331</a></li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/f19fbc75f98c5f1349bdfe098c69bdf732a10886"><code>f19fbc7</code></a> (storage) - minio: use env replace creds volume</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/8982e2eab58a059040d483c4ac373e9ccced0765"><code>8982e2e</code></a> (storage) - minio: use minio to distributed</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/06bec7372476dec97304f51754a9c031498fd888"><code>06bec73</code></a> (storage) - minio: fine management affinity</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/9b8f0062892bcd4f720014a142efde4ce6ed10c6"><code>9b8f006</code></a> (storage) - storage: remove assert</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/59d64b92e21603e86573699e5b1e2914672cfe3a"><code>59d64b9</code></a> (storage) - storage: change listen to POD_IP</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/60044ee012378c0c344518f5945ed6dace124535"><code>60044ee</code></a> (storage) - storage: add juicefs mount options</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/189f944175bd9c16d3a8d5347a9040143903e15a"><code>189f944</code></a> (storage) - storage: remove volumeName</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/302fe8964b3171bc6c7cdddd494d5e3ca62c5209"><code>302fe89</code></a> (storage) - storage: mv to minio dir</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/6ec586d742cf14f311e2ac097ad207c2b3fb65b4"><code>6ec586d</code></a> (storage) - storage: change readinessProbee andlivenessProbe</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/0e028dfee98c4cf8a54110101f1084b03cf75b8e"><code>0e028df</code></a> (storage) - storage: add minio pdb</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/cf9bd2de2b8138b6a75c1d804e919586d2d53eca"><code>cf9bd2d</code></a> (storage) - storage: add check storage health svc</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/2dd5c9f20dcbbdb184d3e0be19a9e93b41ac1019"><code>2dd5c9f</code></a> (storage) - storage: add volumeBindingMode</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/fa2effc313905bf8e7a0d41d6d09335ca1a70552"><code>fa2effc</code></a> (storage) - storage: remove databaseBucket</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/d166cc721e45bf1955a2d99b70187ee9b3d6970a"><code>d166cc7</code></a> (storage) - charts: format network-policy name</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/d06bcce9fe0e8de7720e5c93b5d87e742be7f5a7"><code>d06bcce</code></a> (storage) - storage: upgrade to golang 1.19</li> +<li><a href="https://api.github.com/repos/drycc/storage/git/trees/c2ca05cd4b92259d4454723ab25252e4f6e220ac"><code>c2ca05c</code></a> (storage) - storage: upgrade new require</li> +</ul> + + + + + + Blog: Drycc Workflow v1.5.0 + /blog/2022/10/06/drycc-workflow-v1.5.0/ + Thu, 06 Oct 2022 00:00:00 +0000 + + /blog/2022/10/06/drycc-workflow-v1.5.0/ + + + + <p>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.</p> +<h2 id="workflow--v140---v150">Workflow ## v1.4.0 -&gt; v1.5.0<a class="td-heading-self-link" href="#workflow--v140---v150" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>passport v1.0.0</li> +<li>rabbitmq v1.0.0</li> +<li>imagebuilder v1.0.0</li> +<li>builder v1.2.0 -&gt; v1.3.0</li> +<li>controller v1.3.0 -&gt; v1.4.0</li> +<li>database v1.0.2 -&gt; v1.1.0</li> +<li>fluentd v1.1.0 -&gt; v1.2.0</li> +<li>redis v1.1.0 -&gt; v1.2.0</li> +<li>influxdb v1.0.1 -&gt; v1.1.0</li> +<li>logger v1.1.0 -&gt; v1.2.0</li> +<li>minio v1.1.0 -&gt; v1.2.0</li> +<li>monitor v1.1.0 -&gt; v1.2.0</li> +<li>nsqd v1.1.0 -&gt; v1.2.0</li> +<li>registry v1.0.3 -&gt; v1.1.0</li> +<li>registry-proxy v1.0.2 -&gt; v1.1.0</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0f5f8e4171313ea56de2d659d92458acd39a3201"><code>0f5f8e4</code></a> (builder) - builder: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f269d06ddc42464ba99ceeabc283645778034547"><code>f269d06</code></a> (builder) - build: add buildx supportjkjkk:q</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5e72fe88f057c1814c6d8075638d124445c16157"><code>5e72fe8</code></a> (builder) - registry: use docker build</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/25d8a4cbc14ccfeccc0a33d17fc723149103a0d3"><code>25d8a4c</code></a> (builder) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7a3e1c58942dfdfde474462f92a2a5bddf1c15a8"><code>7a3e1c5</code></a> (builder) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/46b75ff211da2985ce17737e7c6bb29ce73c8df3"><code>46b75ff</code></a> (builder) - builder: add cloud native buildpacks support</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2db2054dd960f80ee76c442d3705490c5f70358a"><code>2db2054</code></a> (builder) - builder: unified build model</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/4b7f9d9bc38c65ca56e162701b4cbce43c1cbbbe"><code>4b7f9d9</code></a> (builder) - builder: add initContainers</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b78c936ec706cce8bd8e8676a411187fed658b23"><code>b78c936</code></a> (controller) - token: add get token api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bac52a51b06872d48ecefabfb14b29b9f70d4357"><code>bac52a5</code></a> (controller) - tasks: use celery replace nsqd</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b9b0c58b1f877d077543efb202c71f5cec07b6fc"><code>b9b0c58</code></a> (controller) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/205dcb3b5b1003d704a0033d3a3b8b6761393df9"><code>205dcb3</code></a> (controller) - influxdb: add influxdb client</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ff15849bafddc47e06820ca89e8e95abc6c89311"><code>ff15849</code></a> (controller) - influxdb: upgrade to influxdb 2.x</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4016244757d764b553abd20ffb8ed79368c7caa1"><code>4016244</code></a> (controller) - controller: push data to influx</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/fcfce2ea7f6af657c46a1c53f0f78b7224b56ff6"><code>fcfce2e</code></a> (controller) - workflow-manager: add workflow-manager support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/00e9bfb627c11be35fd57c330d3127c84675b0f6"><code>00e9bfb</code></a> (controller) - influxdb: review influxdb code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/dd644d5a5e626d51ddb6f4d6488691ac7f2f2804"><code>dd644d5</code></a> (controller) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/118278b332877428f09d13801432a8c7f51ebbee"><code>118278b</code></a> (controller) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/122a9cd267f8b80d4b922938b97a71032f174648"><code>122a9cd</code></a> (controller) - oauth2: add oauth2 support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/559a5b6c76a0b9925bdd7d027e5653b7d494d4ac"><code>559a5b6</code></a> (controller) - controller: use cncf buildpacks replace slugrunner</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/96130e6900dae2bc31899e3a06fec87c5c6684c9"><code>96130e6</code></a> (controller) - charts: database configuration optimization of passport and controller</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2ea85089f9ef7814e7c504380929c09cd73fadb2"><code>2ea8508</code></a> (controller) - oauth: using passport authentication</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/868c437940b7cde4caaf0b4f81ab5265cd2f197c"><code>868c437</code></a> (database) - database: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/eadd5da76c3a5979a90b52b245dc9041da861d6a"><code>eadd5da</code></a> (database) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/b6eea4c09dcd95d7f8f0540c2ffef63567146167"><code>b6eea4c</code></a> (database) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/04a88dbafe96027068badd9e65c30b832432c371"><code>04a88db</code></a> (database) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/92ed309894ef2d065d4dc20acf5cf44dfafa84d7"><code>92ed309</code></a> (database) - database: add initContainer</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/ee6b78ff78bfe978edf2e9a9789bdf58c2dc846f"><code>ee6b78f</code></a> (fluentd) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f523e30c5e93d80e509232e7bb25f4de92267312"><code>f523e30</code></a> (fluentd) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/ee47b53b6f18bf4e2cdd41aaabf4dcd807d4b2d7"><code>ee47b53</code></a> (fluentd) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/80a51af1c0dbf689ead41a4b88d5e31861a7b0d0"><code>80a51af</code></a> (influxdb) - influxdb: modify influxdb naming rules</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/fb1003086e3819ada293e1792b46e966e509ee3a"><code>fb10030</code></a> (influxdb) - influxdb: use influxdb v2</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/0e87ad8c239a8cbb4ec02a584081ac1be0cb21af"><code>0e87ad8</code></a> (influxdb) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/9d108019d94ce2e653ec16482e89dff314810f9b"><code>9d10801</code></a> (influxdb) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/d825c9f7b4198c10e93abc7121af54f7af63f711"><code>d825c9f</code></a> (logger) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/b1395766670636ecbb42fb0b4ca1649186bfd4c5"><code>b139576</code></a> (logger) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/88f84ea95e334fcfef45ecd4f28c8bc468523574"><code>88f84ea</code></a> (logger) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/5ccae3ef8fa0894f08bf6ba552b17455a481a698"><code>5ccae3e</code></a> (logger) - dockerfile: remove chmod cmd</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/193aefc8c4106c7c6d5022c9183c68d6e604e735"><code>193aefc</code></a> (logger) - logger: add initContainers</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/baee3305a3b09a0fba83f33fb161400a7e7fd7fb"><code>baee330</code></a> (minio) - minio: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/ad5d055e170977801a6951813e4896d1f854e14f"><code>ad5d055</code></a> (minio) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/19868d457852e423536d8ae8f426a2c3437f423d"><code>19868d4</code></a> (minio) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/4bd84b8bb8af65a0ab05eff3a4c227452c4a3a2f"><code>4bd84b8</code></a> (minio) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/79d1f2f85c17c71ec609e8e191e04e9de87deec0"><code>79d1f2f</code></a> (monitor) - database: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/88e5a7f45886f5ca947e44052c5c52a2f8e17497"><code>88e5a7f</code></a> (monitor) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/5672e99a81ce856e4cd42a1b4e1083919e165272"><code>5672e99</code></a> (monitor) - influxdb: modify influxdb naming rules</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/867210310f29da9600bb2d052e05d5181cfe5a4f"><code>8672103</code></a> (monitor) - influxdb: use influxdb v2</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/66cb4c877ee0acfdcabab284da18b58266b61201"><code>66cb4c8</code></a> (monitor) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9576eb38c61048d3d540303047c8690763d664e1"><code>9576eb3</code></a> (monitor) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/30809c9ce3f31f52ac10616dbe9a24135d74828d"><code>30809c9</code></a> (monitor) - monitor: add initContainers</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/70d140ce05b061462a990029b9fd7ac749c383c7"><code>70d140c</code></a> (nsqd) - nsqd: using self compiled nsq binary</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/1073d4f35b082ea6dd63570d8427d7e3d1c2fecf"><code>1073d4f</code></a> (nsqd) - nsqd: use GOPATH replace /go</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/e49848037b54362f83ee063adc6e954afe8fa84a"><code>e498480</code></a> (nsqd) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/cf9b7d5cd6ee63d77acadec5c3a410acb60df400"><code>cf9b7d5</code></a> (nsqd) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/c335856f1ca9c80b0dc23df3445d395a13b8b50b"><code>c335856</code></a> (nsqd) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/efba7134453bc730b968d909089564de3de3079a"><code>efba713</code></a> (redis) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/c7a3b53025faa393bf6e915ec71b96ef7a5da27f"><code>c7a3b53</code></a> (redis) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/4cdad7bab726dd11973c1dbc643a81eb6313ba1f"><code>4cdad7b</code></a> (redis) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/652b443a4e5c54765bb40cfeb38310eee455a3c2"><code>652b443</code></a> (registry) - registry: multi-platform support</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/4060176efaca5531faec4ecdd02eb30b6451e16e"><code>4060176</code></a> (registry) - registry: use docker build</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/7102a03677830beb4b0ad093b141cb48ba948dd7"><code>7102a03</code></a> (registry) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/6c8600d293589b36748acf7b4dfb913f2cefde8d"><code>6c8600d</code></a> (registry) - charts: set the default chart version</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/33a51c99e3f278c7c36dfc27c124db3dec530914"><code>33a51c9</code></a> (registry) - registry: add initContainers</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/bef70dc98c4b044d1108f6b42f439b36d37270e1"><code>bef70dc</code></a> (registry-proxy) - build: add buildx support</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/d2319c1fce4e57cd9257ec3978f4e5a8d0101a23"><code>d2319c1</code></a> (registry-proxy) - docker: dealing with the change of docker in kubenetes 1.20</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/02fafed2b1b5648274c3d44c3d113a0a025e4fca"><code>02fafed</code></a> (registry-proxy) - charts: set the default chart version</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5499c9a2844c192285d5afdbf6a08d803a70cf8d"><code>5499c9a</code></a> (controller) - gunicorn: gunicorn not running</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/06e9e8869fbf61b3db753ab211bd9d465afa9058"><code>06e9e88</code></a> (controller) - controller: error loading shared library</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/01b5bd04cf1848b876b2b5acbeae6c361bebf975"><code>01b5bd0</code></a> (controller) - controller: upgrade celery config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6e32d55cf9de3dce1b7d470f850c2d155809cc07"><code>6e32d55</code></a> (controller) - controller: fix update resources bug</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0e0d53f3056dfbf427ad7a474786e723b87cb39c"><code>0e0d53f</code></a> (controller) - chart: set the domain depends certManagerEnabled</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/2ac4ca839d76a4b80205506938d63f25bb4abea0"><code>2ac4ca8</code></a> (controller) - passport: error loading shared library libexpat.so.1</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a0dd517e189a2ba9472c0d320ba32d091520dcbe"><code>a0dd517</code></a> (fluentd) - fluentd: drone build</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6eca2a3e17e2965816718963fe4d7f6ffeb15a42"><code>6eca2a3</code></a> (logger) - logger: golang lint</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/63b0aa0989db8f9e15daa415c5a0b56e9350c0a9"><code>63b0aa0</code></a> (registry) - drone: charts url error</li> +</ul> +<h4 id="docs">Docs<a class="td-heading-self-link" href="#docs" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/472cfcc226c98d2b9a74c367519d57ec31890b71"><code>472cfcc</code></a> (controller) - controller organize README.md document</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/d9d6e292c602c3538784de6755b40f4655710278"><code>d9d6e29</code></a> (redis) - redis: delete links that do not exist</li> +</ul> +<h4 id="test-case">Test case<a class="td-heading-self-link" href="#test-case" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1468f57465243709594b0d6472636ccc0d7b7f62"><code>1468f57</code></a> (controller) - controller: add command unittest</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9999bfd30ab9550966eb70a6e52efbbb38f5cef1"><code>9999bfd</code></a> (builder) - builder:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/cda8b5814e507ab72a0ce7125eaa8d6bdd168a06"><code>cda8b58</code></a> (builder) - builder: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/dc575dde93ad1334be9d1337fbc1b0b66a06ebd9"><code>dc575dd</code></a> (builder) - builder: use imagebuilder replace dockerbuilder</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d3bb183df646a7f2503c739633bb6d5d61778219"><code>d3bb183</code></a> (builder) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5fe34d1fee978986729120af7d5732ed3759b88c"><code>5fe34d1</code></a> (builder) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7e364532bf841109fe5e75c6a5c357ad46f7c4b7"><code>7e36453</code></a> (builder) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/52b8d9df26f28e562b4eca72e777106db86db9db"><code>52b8d9d</code></a> (builder) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/65963f4b35d2b60e376818d314cd203fb698eaba"><code>65963f4</code></a> (builder) - k8s: add privileged to dind</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d345fcf23f1c3e755ec646d988c5d1e0e90d2eba"><code>d345fcf</code></a> (builder) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7975c998252a66557bbfa774ac18f18e17a5ddbd"><code>7975c99</code></a> (builder) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/59633dd9197fed8400d8007cc93e7a62404e92b1"><code>59633dd</code></a> (builder) - builder: modify launch imagebuild pod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8d14e67e5e84c2d6b6254b7704219c9ed38aac67"><code>8d14e67</code></a> (builder) - builder: use Procfile in anywhere</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5357fa88e56ef24fac7f8d3dc0bfa5d990c1be58"><code>5357fa8</code></a> (builder) - go: bump go mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8d26ac054edeb67e4ce473507a96951dbda10db2"><code>8d26ac0</code></a> (builder) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0af620def4db8473c799c9499a4a27ee4a278210"><code>0af620d</code></a> (builder) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ae84303f6d15b22c525e62cf3ae2d1e314d9a67b"><code>ae84303</code></a> (builder) - builder: run imagebuider replace pod with job</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/3b2c496a00a8512731c18d79215ce9e279b60e19"><code>3b2c496</code></a> (builder) - builder: change docs website</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5679a4cfefd214b7bb0014cde3f7c461bd70ca91"><code>5679a4c</code></a> (builder) - builder: upgrade to golang1.17</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a214503452b10f3e265d97954964d321480b007d"><code>a214503</code></a> (controller) - controller:replace whitelist with allowlist</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/375ddcc15761326b8c74f8cd78a239cfe9c14224"><code>375ddcc</code></a> (controller) - ps:drycc ps:list show autoscale num</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c32e409b6fe09c533bc5cfdbf35b47e633d2a644"><code>c32e409</code></a> (controller) - ldap: canot register when ldap is enabled</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c46580a6264cbe21ee5240fde5791c9c78ef2a19"><code>c46580a</code></a> (controller) - controller:modify redis config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/fa9e87b6131a9669eebafb4bfea26dc5f15bde64"><code>fa9e87b</code></a> (controller) - chart:modify controller charts</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6f9fd081e6826fd89316ff4d064c9cf03501e1d3"><code>6f9fd08</code></a> (controller) - nsq: remove nsq</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/994b2dc68afdeaedc540525422183565bc1e3230"><code>994b2dc</code></a> (controller) - docker-buildx: add check-docker</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a720c3a9933aaaa15d5933143708fbcac2d5233a"><code>a720c3a</code></a> (controller) - controller: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e9a5c843d0abd85ae57d8cb87cbe7369364b07e6"><code>e9a5c84</code></a> (controller) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a26614acb4fb8cef5030e0e56681939977a7a266"><code>a26614a</code></a> (controller) - controller: add rabbitmq env</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3df229d2d31b6f8fc79a260e5088a86d00716459"><code>3df229d</code></a> (controller) - controller: modify database config &amp;&amp; remove redis port config &amp;&amp; add env prefix with DRYCC</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/257e94b429c8f7b0c636a083215d9709baaf5c8d"><code>257e94b</code></a> (controller) - controller: CELERY_BROKER use rabbitmq and modify celery-deployment cronjob</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f4d6ec343ec3fb618ef9ee8da09474294d49807e"><code>f4d6ec3</code></a> (controller) - chart: pretty chart format</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/63e61951cda276fe59a91a64a7b84f7feb66ce6d"><code>63e6195</code></a> (controller) - influxdb: modify influxdb code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0f6d408734984e4ec9bbc56c0a4b68ba5783b680"><code>0f6d408</code></a> (controller) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/87bad28b65b773e6534c4cc8e2128045d3ffb7c3"><code>87bad28</code></a> (controller) - python: upgrade to python3.9</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e8f75603cd0cd38423d774f1b3220b64ef9eb6dd"><code>e8f7560</code></a> (controller) - volumes: modify mount summary</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6cf6c6bdbf029b1e52a36d5148d5a025fb6d04c1"><code>6cf6c6b</code></a> (controller) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a9397e8c06a69d5539e8f5b67be242932e69c2c8"><code>a9397e8</code></a> (controller) - oauth: modify token Authentication</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c7f8c8b3b2294205603afd9ca4a7ba2e3f6cea02"><code>c7f8c8b</code></a> (controller) - deps: bump django from 2.2.14 to 2.2.18 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a1a08aa4165ba678e979d6ca4477694999d0e5b8"><code>a1a08aa</code></a> (controller) - deps: bump djangorestframework from 3.11.0 to 3.11.2 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/efd78b42038a404d53d06e92bb609cc7f97739db"><code>efd78b4</code></a> (controller) - deps: bump django from 2.2.18 to 2.2.20 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/649b044c644c9729b80e5f0e2663779bcc648ef2"><code>649b044</code></a> (controller) - deps: bump django from 2.2.20 to 2.2.22 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/41b742bbec9370490b0176fac407bcbd83abd2ed"><code>41b742b</code></a> (controller) - deps: bump django from 2.2.22 to 2.2.24 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/22ffe5d8dd51cffc38e5e3757ac97eba02861e2b"><code>22ffe5d</code></a> (controller) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c98b46837efa85a5daf46c6dc40d45606b7548bc"><code>c98b468</code></a> (controller) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/20e6edb1001fb709ea877349771404ee807ae36d"><code>20e6edb</code></a> (controller) - chart: modify the problem of using buildpack</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/db16879a4ce64c7020b7622603f53ef88898be0a"><code>db16879</code></a> (controller) - controller: pretty pods list print</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ba6f456ddb0a48a0e8c1f446330a838ba27b8f48"><code>ba6f456</code></a> (controller) - test: pretty pods list print</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5fce4b7a77c91836d921c6d1f4cb8cacb2ab953d"><code>5fce4b7</code></a> (controller) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e9e0bcb36d4b6b1169446c484357260aee7feba7"><code>e9e0bcb</code></a> (controller) - oauth: using passport authentication</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0311172bea0f1d28959ee528c0e50493d0c8d425"><code>0311172</code></a> (controller) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/150eff1c246b908e8f5521cc1e5e9ff4c765433d"><code>150eff1</code></a> (controller) - charts: update cert-manager api version</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/de8545a568984f52e5757806d9ce631864285fed"><code>de8545a</code></a> (controller) - controller: update requirements</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1442207889955cbf230bd1c87867acaab72256fb"><code>1442207</code></a> (controller) - controller: using django native JSONFiled</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ab4e836a55aa61cbdb222a8fc606b5619625337e"><code>ab4e836</code></a> (controller) - oauth: modify passport api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5c54e0642c76bfa1253397177b5aef2dc28dc611"><code>5c54e06</code></a> (controller) - controller: eliminate pip warnings</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/870328ddf06ab6b3004fd0e56516de6496c06e26"><code>870328d</code></a> (controller) - controller: remove entrypoint</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5e5e6ae5763333989e153119c6078c06788d0f78"><code>5e5e6ae</code></a> (controller) - controller: upgrade celery config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/607778ffb2f81b74457db2b34952a0cd01647eb3"><code>607778f</code></a> (controller) - controller: add initContainer</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/23dc016da2419237814a7d1ac54435adc99f0423"><code>23dc016</code></a> (controller) - chart: set the domain depends certManagerEnabled</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f3cf20b610a649d105e4889212272604615ddfa7"><code>f3cf20b</code></a> (controller) - controller: remove default bash env</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/73f26364110a1cdee5bdfe868e4fbf0be2cdbcf4"><code>73f2636</code></a> (controller) - controller: modify alpinelinux repositories</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/498e9f2fbd5470ff8079e09eacc04be4272d9601"><code>498e9f2</code></a> (controller) - chart: change certManagerEnabled to boolean type</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/27f5308938f972d078e78c539e9160cc2f3b3a1a"><code>27f5308</code></a> (controller) - passport: exclude cryptography</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/370b75dc9cbdcf24b3955b562ff276e3214eb5a2"><code>370b75d</code></a> (controller) - controller: use sh env</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/07585b4f45471b22e6942590dac51cf724e8bd57"><code>07585b4</code></a> (database) - postgres:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/20172dcfac8370b389aa26a30cc9e2f0a96f6a6d"><code>20172dc</code></a> (database) - database: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/abb9b88a96e0098d3fb1128d123825ca4faea3a4"><code>abb9b88</code></a> (database) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/e72f58ffa50be0f5170423529292872fcd53cfea"><code>e72f58f</code></a> (database) - chart: modify the off-cluster database</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/a91f64f694c15143b7210597ffdd7dacfa6668bf"><code>a91f64f</code></a> (database) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/614fb76a1c77b8f5697a87aadfd094d6eaa8c27b"><code>614fb76</code></a> (database) - tests: use add-host replace link</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/a3428f353c38f440381890fd80416ad302033352"><code>a3428f3</code></a> (database) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/239fef11f87655203f6090e55259cb09906fb253"><code>239fef1</code></a> (database) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/42858e1e2ae1a09e1bad75e1fabb7ec4115e7197"><code>42858e1</code></a> (database) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/d0fe85094eb305ce071f51bf40bdf2099b88ea13"><code>d0fe850</code></a> (database) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/34a36ad4f650d6eaf2320e55f4d80a06e0dd1675"><code>34a36ad</code></a> (database) - charts: Nn secret is generated during off-cluster</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/064ccf462a1bd2fe513809c39919fc1ccaba7801"><code>064ccf4</code></a> (database) - database: create database</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/9228992327543f008bf4158be8b8cd1777c3ba90"><code>9228992</code></a> (database) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/9f7810c6dcf6323bc6f75345f4c9fc25a5e11ef6"><code>9f7810c</code></a> (database) - database: upgrade to wal-g v1.1</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/05783f4118cd7e8cc80e41c20656f5b16961fa3d"><code>05783f4</code></a> (fluentd) - fluentd:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/0739809ba68d12ef8940f0f6addcfea7353885f5"><code>0739809</code></a> (fluentd) - influxdb:replace monitor-influx with influx</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f02487cea73f20a2039fe6c1960950a3b73107b5"><code>f02487c</code></a> (fluentd) - fluentd: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/2c96cc089f7965286409cb4d710df5ab947b20b5"><code>2c96cc0</code></a> (fluentd) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/b20c429b9ace293c7add60fa350098b91285bf87"><code>b20c429</code></a> (fluentd) - charts: remove port config</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/6dd019721438cf32f2262bdb76d74da9ab5b37a3"><code>6dd0197</code></a> (fluentd) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/c5bec512a902662a8200639b3b574925c836e734"><code>c5bec51</code></a> (fluentd) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f8524b78536b6d6cc1022e3cfa6ab61ac36fbca8"><code>f8524b7</code></a> (fluentd) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a50878aabea91b3fbbafaf9c1f43c2eca7fe5a5c"><code>a50878a</code></a> (fluentd) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/14fe20e811ba3c8814188dcec18ed69c169c4b9d"><code>14fe20e</code></a> (fluentd) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/4a2f66070910abcc3068d0e03a8e52d1e5d2659d"><code>4a2f660</code></a> (fluentd) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/de2dd9178130101f4b0c5ed82d5e80a1ba4dd591"><code>de2dd91</code></a> (fluentd) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/a9f1944c3dcac5e8f0eb2f44d11ec81517735b8c"><code>a9f1944</code></a> (fluentd) - fluentd: upgrade to fluentd1.14</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/7cb4e954704cfa5ff37d3b95b5e9a231188f4264"><code>7cb4e95</code></a> (influxdb) - influxdb: change username to user</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/0fdc21b2a95003abd488cb05b640ec1fa1db3ff7"><code>0fdc21b</code></a> (influxdb) - influxdb: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/b2acddb8d72bd0e17fb0b543a8f98e2fa5d57735"><code>b2acddb</code></a> (influxdb) - influxdb: change default path</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/ba8891910d5ef9084f9dd9b7569d905e19f056ea"><code>ba88919</code></a> (influxdb) - influxdb: add check_env function</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/91174010ed68356d9b813b70e2def18af9ed5186"><code>9117401</code></a> (influxdb) - influxdb: modify init_influxdb has_bucket</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/092a3e6b96e9494f00e7a0627b2aa9ce1212c7d4"><code>092a3e6</code></a> (influxdb) - chart: pod not readiness</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/51de380cc83177be8bdb557894b9fd5c28ed0a3d"><code>51de380</code></a> (influxdb) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/66d76679cc55578d13274fa5bf0e653b258e57b4"><code>66d7667</code></a> (influxdb) - docker: replace influxdb base image</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/3aa30943cea519fff18c23264c99c226cfb43c80"><code>3aa3094</code></a> (influxdb) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/influxdb/git/trees/14b9c24f110297e5b6a632ce4ad94625f5663038"><code>14b9c24</code></a> (influxdb) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/02b4cd111c092393b0f2d3f1c1654d0476603b03"><code>02b4cd1</code></a> (logger) - logger:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/114b5d5392a1d82f8dc73b4b1527e742fcaf22f1"><code>114b5d5</code></a> (logger) - reids: delete the logger prefix of redis</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/639278a8f055d7872491db2240f4327d4f77114e"><code>639278a</code></a> (logger) - redis: remove logger from redis conf</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/90195e27521b44e0d43f8fb7ff9ab9a658f60676"><code>90195e2</code></a> (logger) - go: remove GOOS and GOARCH</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/31e2e27f9160e62b199c196972fe5c0097a78a22"><code>31e2e27</code></a> (logger) - logger: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/8fbd9fa7b119f112221be5fa5bdc21e3a891a6b9"><code>8fbd9fa</code></a> (logger) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/b39df2d46e0f625900f80d0103a5a35c4e7fbb0e"><code>b39df2d</code></a> (logger) - charts: remove redis\nsqd port config</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/35d6d0784df91dc1036928c83905052962a84ca0"><code>35d6d07</code></a> (logger) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/69aabf527a1bea60f6d7792a488ed074d138a27a"><code>69aabf5</code></a> (logger) - tests: remove docker link</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/e916644cd89379731f5a9990044e3f64d570b6dc"><code>e916644</code></a> (logger) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/d6872b7cfbd30d0be087270b581a0730961f4b8b"><code>d6872b7</code></a> (logger) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/37801daabfe98292c54ed2902aeb120069448b64"><code>37801da</code></a> (logger) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/cfb4b38897136e5c1b942433b52944cdccc9b195"><code>cfb4b38</code></a> (logger) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/8bda3bf9906424c9be8661ab0d6850ae6e3352ea"><code>8bda3bf</code></a> (logger) - go: bump go mod</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/e13ebfcd5fc940393e1d398623650bfcd31c24de"><code>e13ebfc</code></a> (logger) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/38e6d8d592ad42a176d08f0d7edbe38e55b39b72"><code>38e6d8d</code></a> (minio) - minio:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/d6925ddec232dd3b6187414f4a11327330baa95a"><code>d6925dd</code></a> (minio) - minio: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/d56bc39ba487c24e89a47e6c63375342ba3c3552"><code>d56bc39</code></a> (minio) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/e4696cc243711c53a1fe16051cd80209c8a3d281"><code>e4696cc</code></a> (minio) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/70c5c7988a513b5a39b92e442b0f9052d1507f67"><code>70c5c79</code></a> (minio) - minio: use latest version</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/773cf6c47a4ab539dcac29084980953bdd0e9e04"><code>773cf6c</code></a> (minio) - Makefile: remove DEV_REGISTRY ?=</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/5ce5bc696e7522107139cccfec37c6dc4b759059"><code>5ce5bc6</code></a> (minio) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/5da8be3ca9345e7a6c87ad61bf104b7345523691"><code>5da8be3</code></a> (minio) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/c1f0611fed4e73a5109f1d15901721fa968d6c34"><code>c1f0611</code></a> (minio) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/b73f7927c34fca39605e13930a06fad829658e7b"><code>b73f792</code></a> (minio) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/79d1c935ee59bf45af52a1265aa87e2ef3233f40"><code>79d1c93</code></a> (minio) - go: bump go mod</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/c448899edbaacf8d54cdbad53561733069c1020b"><code>c448899</code></a> (minio) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/15ee49ef85be819d3f6eed5dde4551ffa31f5fae"><code>15ee49e</code></a> (minio) - minio: migrate deprecated warning</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/9968a1a2095fecda1d3ba3fbd2263e83494d716e"><code>9968a1a</code></a> (minio) - minio: upgrade to golang1.7</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/14fedd29ba64e02c05b6cd5fb06bd261bf9f367b"><code>14fedd2</code></a> (monitor) - monitor:replace the special works</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/52c431ad1701cc15e03d55cbc436c5f4f7472522"><code>52c431a</code></a> (monitor) - reids: delete the logger prefix of redis</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/2c95b47a1f714a421be5860a78dd94c23ddcfdf3"><code>2c95b47</code></a> (monitor) - redis: remove logger from redis conf</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/da9bc5605eb4a118bca92fdff3cc49c2f208c040"><code>da9bc56</code></a> (monitor) - monitor:remove influxdb</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/53f47b9a3b8dec717d049b9be3961e4efd446381"><code>53f47b9</code></a> (monitor) - grafana: use grafana docker image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/5bdb188a7255e845cda8a49806053f12032d196d"><code>5bdb188</code></a> (monitor) - grafana: use grafana docker image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c0586dda982c857e61b89964f34b57028cfaa29c"><code>c0586dd</code></a> (monitor) - monitor: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/87d02b6c80ef04c1170e848e9febdb723c9503c3"><code>87d02b6</code></a> (monitor) - charts: add nodes and persistentvolumes rule</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/1b5598fb479f85808bb33ef29b8cd21ab9d40bc6"><code>1b5598f</code></a> (monitor) - monitor: modify grafana dashboard with FLUX and pretty config.toml</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/bcbc0d5b3ef1b16a9e4b22208f5c628156a556cc"><code>bcbc0d5</code></a> (monitor) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9418c9e13b4fb20f4174ee965044cf30ca12ae38"><code>9418c9e</code></a> (monitor) - monitor: fix upload dashboard error and modify INFLUXDB input</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/589f29a84eeab3f9fbc1cce1e49a601938a32987"><code>589f29a</code></a> (monitor) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f776f8a650fd4c0c1e5f21dc9aa38ad36ca5be72"><code>f776f8a</code></a> (monitor) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6ca306092ca874c666066dffce4f3f8fad11bbcb"><code>6ca3060</code></a> (monitor) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6a9ffb24264ff8d7e5e9407f811e5b38b9e20a38"><code>6a9ffb2</code></a> (monitor) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/45e41ed8d104205a708fd82327e0fa3f3ac3d97e"><code>45e41ed</code></a> (monitor) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/654d407bea3cc3e686416cb2f6e1224990bab741"><code>654d407</code></a> (monitor) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/41e9b9c3c1b371ea815cd480e33c53779c2211a7"><code>41e9b9c</code></a> (monitor) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/99c10d38471587b09fb51ee65c8e602e443b44e7"><code>99c10d3</code></a> (monitor) - charts: update cert-manager api version</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9bf83c40a846784e8375db884a2d417073324408"><code>9bf83c4</code></a> (monitor) - oauth: user oauth passport</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/a128f6d5f97fc060a80a2384f4a2dd2dc916dd12"><code>a128f6d</code></a> (monitor) - chart: change certManagerEnabled to boolean type</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/8f897fe306e15f4d528d0665171d634f0d9b93c4"><code>8f897fe</code></a> (monitor) - chart: set the domain depends certManagerEnabled</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/ba6d793c6110993b227246b8bf0bb861fc468975"><code>ba6d793</code></a> (nsqd) - README:update travis build status</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/49879c4baba2a6824b9f32bb2734aec21debefb0"><code>49879c4</code></a> (nsqd) - nsqd: minimum git clone code</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/c5e26805e49bd1be880fd4857b435359a0840992"><code>c5e2680</code></a> (nsqd) - nsqd: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/21dd17b886aad7e673fdb72fe4ccce3d9786a623"><code>21dd17b</code></a> (nsqd) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/7d86b3cbb2452da48abcc99f165dfa8954f103bb"><code>7d86b3c</code></a> (nsqd) - charts: remove port config</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/c073d952af18ffd83b6f86ce7a55140b36029a63"><code>c073d95</code></a> (nsqd) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/55c297ca70952986cb6a971593bbe0e64adea029"><code>55c297c</code></a> (nsqd) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/165c2aef05413585886651299c11dfb741469b0c"><code>165c2ae</code></a> (nsqd) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/9c6a1f8eb363e1d09eaef29c97eff7b60053103b"><code>9c6a1f8</code></a> (nsqd) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/92830984c4627f1a034f8fcfcb490a09576aa960"><code>9283098</code></a> (nsqd) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/46acf8a349c2d8462ee2ec0b592bde8a26e5f459"><code>46acf8a</code></a> (nsqd) - k8s: k8s deprecated api migration</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/43caf8058c5c9b129744c1a191f234d3b44c793f"><code>43caf80</code></a> (nsqd) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/689747119e18e2f1151404beb1729cad9d6ea5f6"><code>6897471</code></a> (nsqd) - nsqd: use official image</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/297bc05baf835ffe4d103bb6cb7613aa1286be68"><code>297bc05</code></a> (redis) - redis:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/f5f8b5e75b99f11e20a1b3210e4c4a42e342df92"><code>f5f8b5e</code></a> (redis) - reids: delete the logger prefix of redis</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/af7b657e76bbc1201391fe3915e081bd220b96a8"><code>af7b657</code></a> (redis) - redis: change logger-redis to redis</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/8dca154e5ae4a38b42e1eb6e16e01f3e78d5fee1"><code>8dca154</code></a> (redis) - redis: remove logger from redis conf</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/eaeda2d2650c61768092ea7f5846733328e47dc6"><code>eaeda2d</code></a> (redis) - redis: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/53c6358e7fbaf02ec15d0a01afa5e02769e3bfb4"><code>53c6358</code></a> (redis) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/ae37416efe8b6fcfdfabf2d444bd241e7128d889"><code>ae37416</code></a> (redis) - charts: remove port config</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/e985656354c17c1221d8ec35007710e0b9d4f6a3"><code>e985656</code></a> (redis) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/423336a645aa3b5091b76e88e58b501357cc733c"><code>423336a</code></a> (redis) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/be64ab4c2fd6e1edd33ca8c5a4458c74bf6fa372"><code>be64ab4</code></a> (redis) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/3bec735f6849b5649c5a2416e8fdb76fb6c780d7"><code>3bec735</code></a> (redis) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/4f934f6ee96925b70463c660416706eafc21fc3e"><code>4f934f6</code></a> (redis) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/359b8780f014c1627a1290e32231cd53caf6f762"><code>359b878</code></a> (redis) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/83b8ac299c215de85e85485c6c0546bc25a37ab1"><code>83b8ac2</code></a> (registry) - workflow:replace the special words</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/869b280b55534a7fbd2dfc9052044cb487d97730"><code>869b280</code></a> (registry) - registry: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/999c1e936026b79dc0462da166998f3fa4cebec3"><code>999c1e9</code></a> (registry) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5652da941334dfdddbe2636d974e9d687b0d912d"><code>5652da9</code></a> (registry) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/cc8c6c2bc077bad277232d25bc536416dfa6c244"><code>cc8c6c2</code></a> (registry) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/c7bdbd0e67e6bcd35423db7d05aca99a511054ed"><code>c7bdbd0</code></a> (registry) - CICD: pretty .drone.yaml format</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5c55a38592dfd1a7356992018f15f022c02fdfc6"><code>5c55a38</code></a> (registry) - test: use add-host replace link</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/f8866f3e6b4f94e15815e5f79b2adbebe3fd1ed1"><code>f8866f3</code></a> (registry) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/6c8292f9c65b38816fad79bf3f49ff54ad8760dc"><code>6c8292f</code></a> (registry) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/1d50f2ce75f708fd3b07b0c5d5dff2f4bdb8adc7"><code>1d50f2c</code></a> (registry) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/efbca6d2c99e2b170e945f050afa8fb139398a49"><code>efbca6d</code></a> (registry) - chars: change org to imageTag</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/2eafc592dc68c529a8a3a8077ef9d48916718079"><code>2eafc59</code></a> (registry-proxy) - registry-proxy: update nginx</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/071bd86ae3bef755f47e22aad54762a7f1e4c0f1"><code>071bd86</code></a> (registry-proxy) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/c72db9618ee6a73655b4b2c5e940ee9fc9447380"><code>c72db96</code></a> (registry-proxy) - registry-proxy: change travis icon url</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/63ffb920f62b692071fcbf825cbac55bbebe6598"><code>63ffb92</code></a> (registry-proxy) - registry-proxy:replace the special works</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/1d904a61de6cc38bfb071a965de09f5dea0d9996"><code>1d904a6</code></a> (registry-proxy) - registry-proxy: remove docker keyword from charts</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/c8200b1f6f573dba0edb19509fdb56a8357828c7"><code>c8200b1</code></a> (registry-proxy) - docker: use the full name of registry</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/d3fa939d910c7b0c707f191b174d1fce89e4cdb6"><code>d3fa939</code></a> (registry-proxy) - travis: add DEV_REGISTRY</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/5a8b353fa642dbef5929d372ef4ce39657bd40fb"><code>5a8b353</code></a> (registry-proxy) - CICD: use drone</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/703d05a7fa07fc8d5b4c5c4ca0fed8a1ee156536"><code>703d05a</code></a> (registry-proxy) - drone: add image_registries volumes</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/aa71db189c6b489347d8f723bdf881bc0b0abf67"><code>aa71db1</code></a> (registry-proxy) - LICENSE: revert modifications to Apache license</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/710c1260065431acf427bdf7d6d6319024598852"><code>710c126</code></a> (registry-proxy) - drone: always pull image</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/2dcc5e6c4b469cb74b56c8c1f0b69d1d5c58291a"><code>2dcc5e6</code></a> (registry-proxy) - chars: change org to imageTag</li> +</ul> + + + + + + Blog: Drycc Workflow v1.4.0 + /blog/2021/10/06/drycc-workflow-v1.4.0/ + Wed, 06 Oct 2021 00:00:00 +0000 + + /blog/2021/10/06/drycc-workflow-v1.4.0/ + + + + <p>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.</p> +<h2 id="workflow--v130---v140">Workflow ## v1.3.0 -&gt; v1.4.0<a class="td-heading-self-link" href="#workflow--v130---v140" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.1.0 -&gt; v1.2.0</li> +<li>slugbuilder v1.1.1 -&gt; v1.2.0</li> +<li>dockerbuilder v1.1.1 -&gt; v1.1.2</li> +<li>controller v1.2.1 -&gt; v1.3.0</li> +<li>slugrunner v1.1.1 -&gt; v1.1.2</li> +<li>database v1.0.1 -&gt; v1.0.2</li> +<li>fluentd v1.0.1 -&gt; v1.1.0</li> +<li>redis v1.0.0 -&gt; v1.1.0</li> +<li>logger v1.0.0 -&gt; v1.1.0</li> +<li>minio v1.0.1 -&gt; v1.1.0</li> +<li>monitor v1.0.1 -&gt; v1.1.0</li> +<li>nsqd v1.0.0 -&gt; v1.1.0</li> +<li>registry v1.0.2 -&gt; v1.0.3</li> +<li>registry-proxy v1.0.0 -&gt; v1.0.1</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fc7d93f718019cfae02b04c745470b4975c91a84"><code>fc7d93f</code></a> (builder) - builder: use go-dev</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0c2159e4a44f0c3f635dcee1b95afdd741d1935c"><code>0c2159e</code></a> (builder) - builder: fmt code and add create_bucket script</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1b88340205ac77e84ebba7a42215d7d3d40578a0"><code>1b88340</code></a> (controller) - controller: remove deprecated api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a92fdebab64716e4194653a9a17f1c00f70c882d"><code>a92fdeb</code></a> (controller) - routable: ingress support routable</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1e3eab3602538f266305a78c9244be466d685c68"><code>1e3eab3</code></a> (controller) - maintenance: add maintenance support for ingress</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/56b9dd0691c904bd75df928bace98830879eb31d"><code>56b9dd0</code></a> (controller) - crt: support containerd-ctr</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5fc3b46b2acd67af89590f1c7dd85fbfa5e989a6"><code>5fc3b46</code></a> (controller) - controller: add ephemeral-storage restriction</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d677e52c288431517de9ae4bddaaadbd1c8b976c"><code>d677e52</code></a> (controller) - controller: add a volume command</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5f1323a837c71127bb99fd8631934c5bd0cab2a7"><code>5f1323a</code></a> (controller) - controller:drycc run cmd add &ndash;mount para</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/74c36a51eef46ea1c110ee53472be632079ce5e1"><code>74c36a5</code></a> (controller) - tasks: add distributed async task</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/139c3ca9d01d7188c1a499dfffad7b7697e5fd0f"><code>139c3ca</code></a> (controller) - tasks: change nsq reader to async</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f237d74ca6344a5929c9b5089dae07a38c13753b"><code>f237d74</code></a> (controller) - controller:add drycc resource cmd</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/41b46d0653d39d0bdfb42907f7a0b9863bc20992"><code>41b46d0</code></a> (controller) - controller:add drycc resource cmd improvement</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c26f7d82e8fa6fcf4b45ab16fcb0298cb2880f6a"><code>c26f7d8</code></a> (controller) - controller: add LimitRanges support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/45b5d1b904abe94819c3dd306117dcd4e09123ed"><code>45b5d1b</code></a> (controller) - users: add users status api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4e16f9b86ac24b4c62d7d6fddb33278d1880dfa7"><code>4e16f9b</code></a> (controller) - ps:add ps:stop/start command</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/c659fa9e058620fd8ce0ba4fcfc48898f1219f2c"><code>c659fa9</code></a> (controller) - k8s: add k8s cluster domain</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/31a625d71733b47944876ac3fb58fe55cd9b746b"><code>31a625d</code></a> (controller) - ps:add ps:stop/start command</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/00a779a5dbb60a33b621fae13b30a24e39ac55f3"><code>00a779a</code></a> (fluentd) - fluentd: support containerd log format</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f3f1bd42697f08340b6b6f5fbe161c5b6fbb31b6"><code>f3f1bd4</code></a> (fluentd) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/db7147c0e7556a655e185c6f00419f99aff4ed29"><code>db7147c</code></a> (fluentd) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/689c12eed60f53e1afbbcede91a5955360183fa7"><code>689c12e</code></a> (logger) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/78ccc5de7718b8f6fb1caf701d1b4ef72fc64362"><code>78ccc5d</code></a> (logger) - redis: add redis client cluster support</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/9843f2cf9d1d03511296bf7731b59d547bc10387"><code>9843f2c</code></a> (logger) - k8s: add k8s cluster domain</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/6ba122e8b6cbdf7b73785d21961056e6b9fc91ee"><code>6ba122e</code></a> (minio) - minio: add pvc support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/69735500c483f9144f461a2b8a3444e51ddd4dc4"><code>6973550</code></a> (monitor) - monitor: add ingress for monitor</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/cd733053287efbd12c29217cd47c6345c39457ce"><code>cd73305</code></a> (monitor) - charts: add volumeName support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/4769fe9e8d14bdbdca9447f9df23c67c09db2a45"><code>4769fe9</code></a> (monitor) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/87806df02cd84fc5feec304e9bc6e32996396b80"><code>87806df</code></a> (monitor) - k8s: add k8s cluster domain</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/4db40c4f129115019ef41c14df56a2d0092e9da1"><code>4db40c4</code></a> (nsqd) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/b6f3d4fe0f6bc8d3467fdebf21374bed378edf9e"><code>b6f3d4f</code></a> (nsqd) - nsqd: add stateless nsqd cluster support</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/74b85bb9efdcba88a25a2734d512d07ef8068032"><code>74b85bb</code></a> (redis) - redis: change redis to statefulset</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/ff98b5018610d0e2be0ec5c03c7a11232199811a"><code>ff98b50</code></a> (slugbuilder) - slugbuilder: delete build hook</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/b201c2ff207eddac7327f75d698a77e89d4125a1"><code>b201c2f</code></a> (slugbuilder) - buildpacks: use drycc buildpacks</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0ec042db3c8a4db39088ffe381f518abdb55287d"><code>0ec042d</code></a> (builder) - test: fix test case error</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/4fb113b7351f9f02612b3e14b4d0787b77abb3b2"><code>4fb113b</code></a> (builder) - build: base image replace by alpine</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/443df48c699846c176c1e4a12b5bb42abe790633"><code>443df48</code></a> (builder) - minio: fix not bucket error</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/3dab5b0ce203bcc03891122aca73da5c7342a40b"><code>3dab5b0</code></a> (builder) - minio: create bucket error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/734fca6f371bf73d79d35f1fcdc04ff66cb196fc"><code>734fca6</code></a> (controller) - autoscale: Fix for autoscale on k8s-1.9+ without breaking manual scaling</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a7dcd1000965fae97bad4dc4b908741f856e2d2b"><code>a7dcd10</code></a> (controller) - controller: test pass</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/93f0f2eaa361386bf7775edcbc27c143a71f0dc7"><code>93f0f2e</code></a> (controller) - controller: fix migrations error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4724375b4319e1cbfa1a587e0e856d9eb9b6ac00"><code>4724375</code></a> (controller) - controller: fix test error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7bacf298db4e431c58e86cef028f99fffb5b349e"><code>7bacf29</code></a> (controller) - charts: fix clusterrole</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/90957f727cc883084ff1a81deaada4d62419f0a9"><code>90957f7</code></a> (controller) - pod: sort events error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/440b13edb6e5b9c9fa69f8b6c72f10329a4087d2"><code>440b13e</code></a> (controller) - controller: review table structure</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0a470a6ecffa1fa9d5ef2bb0a71b00ddefb84a1f"><code>0a470a6</code></a> (controller) - controller: bump tornado 5.1.1</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e39218b2216591b7d412baeee5c8e85a7209996d"><code>e39218b</code></a> (controller) - pynsq: no current event loop in thread</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1d8630e250c65051df90b22f023f0f95034f0cc1"><code>1d8630e</code></a> (controller) - tests: fix test_task.py run error</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1ff120213ee452a570a1e23dff85ab3032704a30"><code>1ff1202</code></a> (controller) - controller: fix test case</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d8c0da319db0b559eb8c8b0c28280d7e70613da2"><code>d8c0da3</code></a> (controller) - settings: fix env name</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/6d8fd3605f54c5a3c7ce0d4e5164f772fa22a8ec"><code>6d8fd36</code></a> (database) - 003_restore_from_backup.sh: ignore script exit 1</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/e0394a9a6aa44a066df18b8ad3ddd21e9c9fa1c2"><code>e0394a9</code></a> (database) - minio: fix not bucket error</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/f35f2525602c90dbe397f56005206ed6abf6eb39"><code>f35f252</code></a> (database) - mc: fix create_bucket error</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/74d68865fb7502d04e74418cc2b6ef8316c45778"><code>74d6886</code></a> (database) - postgres: recovery mode not run</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/e50d0c105151dac43b2bbc5f4e316a47dd55e925"><code>e50d0c1</code></a> (dockerbuilder) - caddy: fix caddy not start</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/f3bec7a8a63c586d19caa777b3fa4a7d0de112c7"><code>f3bec7a</code></a> (fluentd) - influxdb: fix influxdb host and port</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/bc19f27d1567281c5c1ae10b9072c9aad33e2013"><code>bc19f27</code></a> (fluentd) - charts: skipped value for daemon_environment: Not a table</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/338d6237ed76464fc47a6ca3d6f3d34927af6aa2"><code>338d623</code></a> (logger) - logger: logger not run in alpine</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/77883026f33f38aa9d01dd4d88298d162a9050e1"><code>7788302</code></a> (minio) - minio: bump minio version</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/619eed0426591646d5fa9e72b77391d6ac817946"><code>619eed0</code></a> (minio) - fix: use go mod replace dep</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/3b42122703b8bfa3203c8115b8d673f2081d2559"><code>3b42122</code></a> (monitor) - monitor: fix host error</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/67998eff2439c406db048a868f61ae9861268449"><code>67998ef</code></a> (monitor) - influxdb: replace drycc-monitor-influxapi to drycc-monitor-influx-api</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/2cc361cf42754562ffa5b6e7c2e14c065e2cd0f1"><code>2cc361c</code></a> (registry) - registry: fix test case</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/548297a7b97e8f28498fa51b50f9232d8c78053b"><code>548297a</code></a> (registry) - minio: fix not bucket error</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/5412ddb1b956fad53d0c59a87c2158b6e014b05f"><code>5412ddb</code></a> (registry) - minio: create bucket error</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/d0d629e5a58d7e91421f2cd344029474e5c630d4"><code>d0d629e</code></a> (slugbuilder) - slugbuilder:fix normalize_storage path</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/d76ecbe4d4d05aeb23a566b2d3c929cca4e63e63"><code>d76ecbe</code></a> (slugbuilder) - slugbuilder: use v3 api</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/c505e182006dd8a734efa14fc851f15340d05929"><code>c505e18</code></a> (slugbuilder) - shellcheck: SC2039</li> +</ul> +<h4 id="style">Style<a class="td-heading-self-link" href="#style" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/c893a1771550c7728f697216b17e38da0f18ec3f"><code>c893a17</code></a> (builder) - builder: fmt code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bba5795cd3f3f36bf2a4b6d37661254143f60328"><code>bba5795</code></a> (controller) - controller: format code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d36082b6f0fbf46487e3fdc6aff0e7866f6462a7"><code>d36082b</code></a> (controller) - controller: fix pep8</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/66026f2f2110fca58f783b8844d9c5b7a794d1f4"><code>66026f2</code></a> (controller) - resource: standardize the naming of resource</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/03d7e2c8bfb120627ec13c4aa37ff7bc3074e88e"><code>03d7e2c</code></a> (controller) - servicecatalog: change servicecatalog to svcat</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/49dbb6d99655dd398978b273ce3fb29051a56cb7"><code>49dbb6d</code></a> (controller) - controller: flake8 upgrade</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/cbfc108b4f209dfbd088f260fe84399bdda5d502"><code>cbfc108</code></a> (monitor) - monitor: format charts and dashboard</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/ee85954d57ae9d19e6e2790090a6fcf1413e8b2d"><code>ee85954</code></a> (slugbuilder) - slugbuilder: use shellcheck</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/3afed2e3592173fcc3522d71dfdbdd45a8b70a01"><code>3afed2e</code></a> (slugbuilder) - docker: simplify dockerfile</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/36b7f688afcb9c8c81016fbbc7b8a3da9537911d"><code>36b7f68</code></a> (slugrunner) - docker: simplify dockerfile</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/61bb0ef367bdabdb3072473e1d639d723b2a8f08"><code>61bb0ef</code></a> (builder) - aws: upgrade aws sdk version</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/0f2e074b748b9f7067cadac63fb83684bc582272"><code>0f2e074</code></a> (builder) - chore: use go mode replace dep</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e9a2219c2d1c9303cd1a60d2e9bdc9e676f07348"><code>e9a2219</code></a> (builder) - builder: delete glide up</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/bb8c518645bcee82e6ab7782496799b6b82b9fd4"><code>bb8c518</code></a> (builder) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/fa6d02f54af2daf51c1b08b4b7ad6a3be2425b45"><code>fa6d02f</code></a> (builder) - builder: upgrade go.sum</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9d61e8da908fae47c33a77c8547e80d1d6d3d812"><code>9d61e8d</code></a> (builder) - build: upgrade go.mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d763a984a800366eb2f6384fbf23c596342720fb"><code>d763a98</code></a> (builder) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/d1bc1aae69b9b16859e11bfa18b1fa2b602bc686"><code>d1bc1aa</code></a> (builder) - pkg: upgrade to new drycc/pkg</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/02b1e98a3b208be80326adb85307663ef931adf6"><code>02b1e98</code></a> (builder) - builder: update go mod</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/8e17d6579e022ce3574ee7582a1f48fc88bb5e95"><code>8e17d65</code></a> (builder) - builder: change alpine repositories</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f32b723ef49069ffeee6f2419e87b5450617df1e"><code>f32b723</code></a> (builder) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/e33dc612d4910ad3b0e56fbb797a7d1dd609bf6d"><code>e33dc61</code></a> (builder) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/3ab4f1c4a587f58230c1c91670831a0927dc6dfb"><code>3ab4f1c</code></a> (builder) - builder: update controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/b2adfac62d24626a8dc5f2cf4d011c4610170e3a"><code>b2adfac</code></a> (builder) - heroku: remove heroku-16 support</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/f429ac8fa76a4b59ed36ab9b1dc2bfee19d0be3e"><code>f429ac8</code></a> (builder) - builder: set GIT_LOCK_TIMEOUT to 30 minutes</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/7197c833a68b1168ee4eba0ac16a6fb569f2066e"><code>7197c83</code></a> (builder) - go.mod:upgrade require pkg controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5f3e22dc87a55d9bd8fd3299f37be26b19c2350f"><code>5f3e22d</code></a> (controller) - deps: bump django from 1.11.21 to 1.11.22 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1db645af644946d8694234b0b7e1f22e762c5424"><code>1db645a</code></a> (controller) - deps: bump django from 1.11.22 to 1.11.23 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/fbe80677bc8fe7d19772a0bc002fb541106ef75d"><code>fbe8067</code></a> (controller) - deps: bump django from 1.11.23 to 1.11.29 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/537d667d5fd896eec054adda6185042d6492cbd1"><code>537d667</code></a> (controller) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a23c65b14ba90a60a6d57aa56a12f201ad7ba33b"><code>a23c65b</code></a> (controller) - deps: update all deps to the latest version</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/546337eced482db0b8e879ce8caaa322503f5f52"><code>546337e</code></a> (controller) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/06023f8b84897c4aeaa14fc45c6d35c16eeed1d7"><code>06023f8</code></a> (controller) - workflow-manager: del workflow-manager</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/bba573609e25e87875ca40ccdef6e4dd4c8cfd1a"><code>bba5736</code></a> (controller) - controller: change cluster-issuer location</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6c436612923a18486982c268d1e23bbd42a3f9a7"><code>6c43661</code></a> (controller) - Certificatechange cluster-issuer location</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/39a47288e3e0bcf7bfa55768c6759ac94c416c33"><code>39a4728</code></a> (controller) - controller:change cluster-issuer location del controller-cluster-issuer.yaml</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9e96d3f9ccda7f8934628444e72e4959bafde91a"><code>9e96d3f</code></a> (controller) - Certificate:upgrade version cert-manager.io/v1alpha2</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8e68049a870b2277663bd0dc09430baa343a5881"><code>8e68049</code></a> (controller) - docker: use INDEX_URL replace index.docker.io</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8fda20583558fefcd239d5e2d6ae09c5c5f881a7"><code>8fda205</code></a> (controller) - cert_manager: change cert_manager_enabled to global</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/6fefb6d00f8909d7269a9171af9db7ba016533c4"><code>6fefb6d</code></a> (controller) - charts: change platform_domain to global</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/064b2ad886b7782598a7f68925d5275ebd88bfd4"><code>064b2ad</code></a> (controller) - maintenance: remove maintenance support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b8797c98a1b2e01f835169ca7493fff508a3cf95"><code>b8797c9</code></a> (controller) - workflow: remove namespace</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1b20d7632a8ca8e4e9f0f6b1c98826af1d846008"><code>1b20d76</code></a> (controller) - quota: add kube quota config</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d780075077cf9f9843ecf79ae36e569eec59cd3d"><code>d780075</code></a> (controller) - pod: add pod default resources support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/3d72c0817b582f050321396240bd4a6bad3bfb16"><code>3d72c08</code></a> (controller) - rename: rename ingress name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0aa6ab9cd277231420b1404b922601debe0aa89b"><code>0aa6ab9</code></a> (controller) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7533a65e78efd06ebe809712791c5399b85efcba"><code>7533a65</code></a> (controller) - heroku: remove heroku-16 support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e5a885d676f052ffdee6bc74e2fe0cffb85a1f86"><code>e5a885d</code></a> (controller) - controller:check mount volume path</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9014e74b5c0312014aa9d20cf9d6aff128f8022f"><code>9014e74</code></a> (controller) - test: optimization Dockerfile.test</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/0b6ebb2f0e18f7e97ed2bb7b2c6008e3be7248f2"><code>0b6ebb2</code></a> (controller) - tasks: change apply_async parameters</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/835f009573d5643d271b6e558793b1c9ae1463da"><code>835f009</code></a> (controller) - wsgi: add tornado 6 support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/67a4ad7cbd50cd9de1214e8d4be27196e8077367"><code>67a4ad7</code></a> (controller) - utils: use threads replace asyncio</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a28949b093e9f4d73c798f24e41d1eaff0cc1cc2"><code>a28949b</code></a> (controller) - ldap: add AUTH_LDAP_USER_FLAGS_BY_GROUP</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a903209c062f3e275f97bc18dc1d2b9a17e1a826"><code>a903209</code></a> (controller) - charts: add custom controller environment variables support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e0e783ecb5e87bf68e83411cfd92f54916aa9931"><code>e0e783e</code></a> (controller) - ldap: change filter style</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d7608251c2f8938b8f5ee1edd0c7d0f371931826"><code>d760825</code></a> (controller) - scheduler: remove debug log</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/a25928ee84e75a84c13c5402cc351e1ec6e3f151"><code>a25928e</code></a> (controller) - wsgi: remove a wsgi.py file</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7b2696e3ea066b59395b63d97fbad5a472d49b5b"><code>7b2696e</code></a> (controller) - log: disable nsq.client info log</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8d5c07b49ba4220ba7946a8bef1a22b1e8d78e47"><code>8d5c07b</code></a> (controller) - charts: add default environment</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/025f4a2ea96c883df3c35b961aaac2bdd9a5b4ea"><code>025f4a2</code></a> (controller) - controller: change quota name</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/ebda60ed125f49524169cb320c79c37d5adc2e6c"><code>ebda60e</code></a> (controller) - controller: review pvc code</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/8832ba952281c2a06dc98dfc6726e7f9e9207d81"><code>8832ba9</code></a> (controller) - controller: change status\binding model type and mount path check container_types</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7148d04c5f1223f06747fae9a33cb3787159ce9e"><code>7148d04</code></a> (controller) - controller: add overcommit cpu and ram support</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4d2087cc9c783e5c2722fd446b64c7263b783001"><code>4d2087c</code></a> (controller) - limits: modify limits unit verification</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/af36970d90b9a8d95857052ab1c97b7727a01976"><code>af36970</code></a> (controller) - api: check cpu/memory range for api</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/329355b6cdde8a382a5fe271f764cca747cd9444"><code>329355b</code></a> (controller) - volumes: modify the volume size</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/9dfee0919449d13e11ec3cfe50a187ecd5de07b2"><code>9dfee09</code></a> (controller) - LimitRanges: modify the default limits</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/5205bca582cd292fcfa7c0abb1bcc98c3dce05f1"><code>5205bca</code></a> (controller) - controller: improve the details of certificate</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/7ebecdfdca2de4936b67bc542053305f098db6d6"><code>7ebecdf</code></a> (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/6415e2ccacef3af313b4df2e7d0924797217238f"><code>6415e2c</code></a> (database) - postgres: upgrade to pg13</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/12e68062d48938c8619f94c30741af6fd2fee8e9"><code>12e6806</code></a> (database) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/d294509c192eb7e2f6f11aedad8aefff83fb8532"><code>d294509</code></a> (database) - minio: use canary minio test</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/1bad02e1768d4d54df61f7df3e54c81bd68e6c52"><code>1bad02e</code></a> (database) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/d51420bbde24cada100f764288c9bd165dbc9f31"><code>d51420b</code></a> (database) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/4133d05d8edec1f1ba2b995354dc98ae863a1da7"><code>4133d05</code></a> (dockerbuilder) - dockerbuilder: update caddy and kaniko</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/6b4dd18637b3a81a64c1be34a6d73832095c638d"><code>6b4dd18</code></a> (dockerbuilder) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/6df9b7c0bc4a22bca7ed2588a070868680382f68"><code>6df9b7c</code></a> (fluentd) - deps-dev: update rake requirement from ~&gt; 10.0 to ~&gt; 12.3</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/c2490f84d991ddfc588bded7e6afe9706e82f090"><code>c2490f8</code></a> (fluentd) - fluentd: upgrade fluentd</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/be4a56a12ce0c8a812b8922630122225532ac3fa"><code>be4a56a</code></a> (fluentd) - fluentd: add Gemfile.lock</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/2237f755e0123eb4138289648b5a0ee64bbd4183"><code>2237f75</code></a> (fluentd) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/c5740650bcb218c59676733c20f5765ae4cb905d"><code>c574065</code></a> (fluentd) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/52b8084cbaa5d0b8c8ca7014f94b596dca911708"><code>52b8084</code></a> (fluentd) - router: delete obsolete router code</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/3b3ccebeced1c4257c0c3ed1a70b7f18a8c6aa85"><code>3b3cceb</code></a> (fluentd) - fluentd: remove manifests dir</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/25c6702f8c1e1c5916b0544ccda64eced3451448"><code>25c6702</code></a> (fluentd) - nsqd: change var name</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/bd571be4178f69cb4bd7ee233440ca889ec5c601"><code>bd571be</code></a> (fluentd) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/72aa4e6b7fe5cb5ef784f894429e3f1e177e5c82"><code>72aa4e6</code></a> (fluentd) - influxdb: change influxdb service name</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/bd61903dd01aa61374a5f527f8ee85bc7820c042"><code>bd61903</code></a> (logger) - logger: use go mod replace dep</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/69c63a1bd602c9a5a68ef3b93d43b2dca161d495"><code>69c63a1</code></a> (logger) - logger: update go.mod</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/3aa9cd715568b46efa26025f25c73ce897436b4f"><code>3aa9cd7</code></a> (logger) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/f05849639ef8e34bacf9a55965ab3d7297df4cf7"><code>f058496</code></a> (logger) - nsqd: change var name</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/6d9787cebb2e992de9743ac0544201b012b21094"><code>6d9787c</code></a> (logger) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS</li> +<li><a href="https://api.github.com/repos/drycc/logger/git/trees/85ed307592a38ae80186f59bf31e504124013e07"><code>85ed307</code></a> (logger) - logger: standard naming</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/d88e7b65131e2fdaa7d4164a4d66793d89cc384d"><code>d88e7b6</code></a> (minio) - minio: update minio api to v7</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/43715d2dd30bc15f5564124e0e5e444ce7ca63c2"><code>43715d2</code></a> (minio) - minio: upgrade minio</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/0e1239b358ce3bde11a1401634f519b7e1c38156"><code>0e1239b</code></a> (minio) - minio: use docker.io replace quay.io</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/f7f047b506a0e6b30b7b88e916d67b1faaba8a52"><code>f7f047b</code></a> (minio) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/afa71289345ed311e603c8847188ccef40774869"><code>afa7128</code></a> (minio) - build: upgrade go.mod</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/aff2db5a41ae72b899f2fc9f70af96730ed16fdf"><code>aff2db5</code></a> (minio) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/4547f14617a76db897b71ef7451db92a832dff1e"><code>4547f14</code></a> (minio) - pkg: upgrade to new drycc/pkg</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/2769b85cbd316cb08da58753d6bae3946d32032a"><code>2769b85</code></a> (minio) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/35dde8df07fb96c4996ef8410780da48e1170e4a"><code>35dde8d</code></a> (monitor) - monitor: update grafana influxdb telegraf</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/9e3a949734f326290dd752c636991cf2e1c962f9"><code>9e3a949</code></a> (monitor) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6af0432fe174769e9d44c03c264ad4a9ea5cee5f"><code>6af0432</code></a> (monitor) - workflow-manager: remove workflow-manager</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/0611c07996da19eb1401278ad5cc5e46d3b1435c"><code>0611c07</code></a> (monitor) - router: delete obsolete router code</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/be048248577d97f8679863c179999ce843806c09"><code>be04824</code></a> (monitor) - cert_manager: change cert_manager_enabled to global</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/37801650414da8539390c4d7cad66f614b90ef6e"><code>3780165</code></a> (monitor) - charts: change platform_domain to global</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/50b04e15f9c3aa51751bb78250907fa22023a419"><code>50b04e1</code></a> (monitor) - influxdb: remove influxdb admin ui</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/6ab4d68b758904d12697b9a129835e6d0474cafb"><code>6ab4d68</code></a> (monitor) - influxdb: remove unuse port</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f1510bd94e48ea41ff4c36ac2140688b5c2dde87"><code>f1510bd</code></a> (monitor) - monitor: update grafana dashboard,telegraf inputs.kubernetes</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/f36de2c251dc63b21a1fdc2c05413d6d50e9f8cb"><code>f36de2c</code></a> (monitor) - pvc: upgrade to new format</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/fc78a0a2627b51a28c730e19f2c8c1c16103829f"><code>fc78a0a</code></a> (monitor) - workflow: remove namespace</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/e85890f298dd68cf6c0e8af70d843e84da600361"><code>e85890f</code></a> (monitor) - monitor: monitoring nsqd and redis separately</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/694f6b1dc801769a8fe82b90ba26422747df6539"><code>694f6b1</code></a> (monitor) - mirrors: delete aliyun mirrors</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/4aea36a822079ba593a646683dba0e35e3e68416"><code>4aea36a</code></a> (monitor) - grafana: add ldap support for grafana</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/68fc30f0f05af759b80e07c4dcd3d2a57c7ffd6a"><code>68fc30f</code></a> (nsqd) - nsq: update nsq</li> +<li><a href="https://api.github.com/repos/drycc/nsqd/git/trees/16f32aaf7b984b24853044b6619dbe9f2b8613e2"><code>16f32aa</code></a> (nsqd) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/04db389e01f6832a6a105a73a0a02c9b7dd6623b"><code>04db389</code></a> (redis) - reids: update to redis 6</li> +<li><a href="https://api.github.com/repos/drycc/redis/git/trees/3f01bab0dbe89fa4094750bdb5c3f0ac503b8f00"><code>3f01bab</code></a> (redis) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/647e4bed5f617727fd50c5e0645fd27cc128461e"><code>647e4be</code></a> (registry) - registry: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/0bbce990d4ff5660ce79020e0bca346a0c716b3d"><code>0bbce99</code></a> (registry) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/a982b503350abfd584d33d0e088bc0a79714fb9c"><code>a982b50</code></a> (registry) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/e088da3304147b568868e0546c321b57f84263b9"><code>e088da3</code></a> (registry-proxy) - ingress: renmae use_native_ingress to use_ingress</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7e88337bbfbc73bc30bd0906f25027c5d266b1c2"><code>7e88337</code></a> (registry-proxy) - nginx: upgrade nginx to mainline</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7204d72c00b2d7360a2d3a20833d701e303a9f62"><code>7204d72</code></a> (registry-proxy) - registry: optimizing variable naming</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/2eafc592dc68c529a8a3a8077ef9d48916718079"><code>2eafc59</code></a> (registry-proxy) - registry-proxy: update nginx</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/071bd86ae3bef755f47e22aad54762a7f1e4c0f1"><code>071bd86</code></a> (registry-proxy) - charts: upgrade k8s newer API versions</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/c72db9618ee6a73655b4b2c5e940ee9fc9447380"><code>c72db96</code></a> (registry-proxy) - registry-proxy: change travis icon url</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/ca9f9623a6867f0c5f4ff973c06613deff9e5dd3"><code>ca9f962</code></a> (slugbuilder) - slugbuilder: del BUILDPACK_URL support</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/1b74dd57a7f19040577f8e55b6a9d993ef496c8d"><code>1b74dd5</code></a> (slugbuilder) - slugbuilder: add heroku-20 support</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/54d4ad2e97e9ff5c805ac985a0e5af0050677388"><code>54d4ad2</code></a> (slugbuilder) - slugbuilder: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/a78f37ee99cec1b7c3eb7cb7a803bf2a5ed7c45b"><code>a78f37e</code></a> (slugbuilder) - slugbuilder: add heroku-20 stack</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/94ac94ac5dd4a387c0e1aaef6638954e41e9983a"><code>94ac94a</code></a> (slugbuilder) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/53b4b8b7ef9dece421a7893c5c3137ab0df8b960"><code>53b4b8b</code></a> (slugbuilder) - slugbuilder: modify stack priority</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/58e2bd28cf5fda8c618a2ba540d9e3acbf46fab5"><code>58e2bd2</code></a> (slugbuilder) - dockerfile: add WORKDIR /tmp</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/b29cd04c1769ef3481ff7c61c41a6e8722664469"><code>b29cd04</code></a> (slugbuilder) - slugbuilder: add pre_build.sh</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/9d319f60a1edd735bc5217054fe365047bd8795a"><code>9d319f6</code></a> (slugbuilder) - slugbuilder: silent mc command output</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/d1ec3c983be9934dd6b86fa51200489eb5555fa7"><code>d1ec3c9</code></a> (slugbuilder) - heroku: remove heroku-16 support</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/5048534c684b76f41ca12136cefd6e6da51ace3e"><code>5048534</code></a> (slugbuilder) - slugbuilder: use drycc stack-images</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/a1165373fc9ca369eec2715a2a49f166430cefa9"><code>a116537</code></a> (slugrunner) - slugrunner: add heroku-20 support</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/a1196bf153c21cefde2122aee5bf7dfa32ac5f0a"><code>a1196bf</code></a> (slugrunner) - slugrunner: del quay.io</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/64c96d720f4b5cdc54b66d349bac6de5567ab331"><code>64c96d7</code></a> (slugrunner) - slugrunner: add heroku-20 stack</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/cc3e2264b67f950fb888502aeea08d41d4c8ccf4"><code>cc3e226</code></a> (slugrunner) - minio: use bin mc replace docker images</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/9130bde01bcfa897ae5c4be6bc59b4a4fe7b92f3"><code>9130bde</code></a> (slugrunner) - shellcheck: shellcheck installer</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/4ea33e154ab4353de5bd5bf6afeb0157756224e8"><code>4ea33e1</code></a> (slugrunner) - slugrunner: modify stack priority</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/5514e8b393daa6f4cd8f3ebe0a619158e32945e6"><code>5514e8b</code></a> (slugrunner) - heroku: remove heroku-16 support</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/be829fb66e68bb9ccc2a1d49e1b364af09219fff"><code>be829fb</code></a> (slugrunner) - slugrunner: use drycc stack-images</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/e1e06be74f2f40740c8e72178ae6ba97233c5bbe"><code>e1e06be</code></a> (slugrunner) - slugrunner: remove Dockerfile.heroku-16</li> +</ul> + + + + + + Blog: Drycc Workflow v1.3.0 + /blog/2020/10/06/drycc-workflow-v1.3.0/ + Tue, 06 Oct 2020 00:00:00 +0000 + + /blog/2020/10/06/drycc-workflow-v1.3.0/ + + + + <p>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.</p> +<h2 id="workflow--v120---v130">Workflow ## v1.2.0 -&gt; v1.3.0<a class="td-heading-self-link" href="#workflow--v120---v130" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.0.2 -&gt; v1.1.0</li> +<li>slugbuilder v1.1.0 -&gt; v1.1.1</li> +<li>dockerbuilder v1.1.0 -&gt; v1.1.1</li> +<li>controller v1.2.0 -&gt; v1.2.1</li> +<li>slugrunner v1.1.0 -&gt; v1.1.1</li> +<li>database v1.0.0 -&gt; v1.0.1</li> +<li>fluentd v1.0.0 -&gt; v1.0.1</li> +<li>minio v1.0.0 -&gt; v1.0.1</li> +<li>monitor v1.0.0 -&gt; v1.0.1</li> +<li>registry v1.0.1 -&gt; v1.0.2</li> +<li>workflow-manager v1.0.0 -&gt; v1.0.1</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/9c7cceb2b775850cbe30c6df7b03bdcf7a35d0d2"><code>9c7cceb</code></a> (builder) - builder: add app config to env</li> +</ul> +<h4 id="fixes">Fixes<a class="td-heading-self-link" href="#fixes" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/7fe44faf2663b20e39b27221a8426cf332f2085b"><code>7fe44fa</code></a> (controller) - docker: docker timeout must be an int, float or None</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/b196550f9ac51f22f422e29d6b1a7aa3708421c3"><code>b196550</code></a> (controller) - controller: revert release.check_image_access for now</li> +<li><a href="https://api.github.com/repos/drycc/workflow-manager/git/trees/cc3ec13a5d5173160f1f6b42726df81119cd69ae"><code>cc3ec13</code></a> (workflow-manager) - glide: bump goautoneg</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ef932c4eb4ea0d592b57f0a4aebdbd6ad039c998"><code>ef932c4</code></a> (builder) - controller-sdk-go: upgrade controller-sdk-go</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4654cf64a919aa64b10253b080e0b6aae86edcb5"><code>4654cf6</code></a> (controller) - django-rest-framework: upgrade to 3.9.3</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/14121f1dae135b137f8ded451cfd1d8f8ca62543"><code>14121f1</code></a> (controller) - deps: bump djangorestframework from 3.9.3 to 3.9.4 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/385acdc7e0359eedb83e10e71877a9ff591bff15"><code>385acdc</code></a> (controller) - deps: bump django from 1.11.20 to 1.11.21 in /rootfs</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/fa312bb7f57f5f8638484bc4d9825aa962031a25"><code>fa312bb</code></a> (database) - postgres: set max_connections = 1024</li> +<li><a href="https://api.github.com/repos/drycc/postgres/git/trees/7ebecdfdca2de4936b67bc542053305f098db6d6"><code>7ebecdf</code></a> (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/b8878f6d4c32540bc864581a457aa6c996e7e50c"><code>b8878f6</code></a> (dockerbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/fluentd/git/trees/b097451f312c0386c466be3b638242535849def0"><code>b097451</code></a> (fluentd) - fluent: upgrade fluent to v1.4</li> +<li><a href="https://api.github.com/repos/drycc/minio/git/trees/4341f9ae71b5dc55c14984d9cacc8e48a3e6e089"><code>4341f9a</code></a> (minio) - mc: upgrade mc and minio</li> +<li><a href="https://api.github.com/repos/drycc/monitor/git/trees/c1ee2a46808c6054ab1393cdd31bf861e01ebdfc"><code>c1ee2a4</code></a> (monitor) - monitor: remove copyrights.tar.gz</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/9854260ef4738be5d25e4a028ebd3125988fec34"><code>9854260</code></a> (registry) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/acc5627dd8f96d3f62e02cd8813cbd829321bd18"><code>acc5627</code></a> (slugbuilder) - slugbuilder: internal support for multi buildpack</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/d58907eb664185c25950953dae4fe4774a2f6310"><code>d58907e</code></a> (slugbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/b39a0c29fef7d76ae681ec7ba2f01e3605a33657"><code>b39a0c2</code></a> (slugrunner) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z</li> +</ul> + + + + + + Blog: Drycc Workflow v1.2.0 + /blog/2019/10/06/drycc-workflow-v1.2.0/ + Sun, 06 Oct 2019 00:00:00 +0000 + + /blog/2019/10/06/drycc-workflow-v1.2.0/ + + + + <p>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.</p> +<h2 id="workflow--v110---v120">Workflow ## v1.1.0 -&gt; v1.2.0<a class="td-heading-self-link" href="#workflow--v110---v120" aria-label="Heading self-link"></a></h2> +<h4 id="releases">Releases<a class="td-heading-self-link" href="#releases" aria-label="Heading self-link"></a></h4> +<ul> +<li>builder v1.0.1 -&gt; v1.0.2</li> +<li>slugbuilder v1.0.0 -&gt; v1.1.0</li> +<li>dockerbuilder v1.0.0 -&gt; v1.1.0</li> +<li>controller v1.1.0 -&gt; v1.2.0</li> +<li>slugrunner v1.0.0 -&gt; v1.1.0</li> +<li>registry v1.0.0 -&gt; v1.0.1</li> +<li>registry-proxy v1.0.1 -&gt; v1.0.2</li> +</ul> +<h4 id="features">Features<a class="td-heading-self-link" href="#features" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/e5584e32ef02329fd091a7a4d3f40bac9894d5a4"><code>e5584e3</code></a> (controller) - controller: add STACK support</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/ad34dc1a501aada4aa2f8ceeb7eefa9fed6baf75"><code>ad34dc1</code></a> (dockerbuilder) - kaniko: use kaniko replace docker-py</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/b81430e8d7ac10167450667cf41e2f9efada6cca"><code>b81430e</code></a> (dockerbuilder) - dockerbuilder: change image to image.json format</li> +<li><a href="https://api.github.com/repos/drycc/slugbuilder/git/trees/60dde96064c69aa7578476c2e4855680f5186706"><code>60dde96</code></a> (slugbuilder) - slugbuilder: add STACK support</li> +<li><a href="https://api.github.com/repos/drycc/slugrunner/git/trees/fe8b6e56dd1a9334844581183bb16eb3d59df366"><code>fe8b6e5</code></a> (slugrunner) - slugrunner: add STACK support</li> +</ul> +<h4 id="maintenance">Maintenance<a class="td-heading-self-link" href="#maintenance" aria-label="Heading self-link"></a></h4> +<ul> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/942f050ec90f771262cbb5634f5df8d5a3818a5d"><code>942f050</code></a> (builder) - registry: remove env DRYCC_REGISTRY_PROXY_PORT</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ff7a16f53ac78dac0c334a9718cdc76c65400732"><code>ff7a16f</code></a> (builder) - registry: remove ecr and gcr registry</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/ad13683ce634c9b4835f45d2b474bac16ca52baa"><code>ad13683</code></a> (builder) - builder: change DRYCC_BUILD_TYPE to DRYCC_STACK</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/6def637d5331330940d0a94cf6313a4bcb67fec0"><code>6def637</code></a> (builder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/5044e223a56ee6283ac8d68a1442a6430b18dd99"><code>5044e22</code></a> (builder) - registry: remove registry_secret_prefix</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/2ea39cc0a9dd68fa1baca4b3725a00b9bcf7f89a"><code>2ea39cc</code></a> (builder) - controller-go-sdk: upgrade controller-go-sdk</li> +<li><a href="https://api.github.com/repos/drycc/builder/git/trees/6aee0d7f092b53c37c70d05db076eaae1bbcff44"><code>6aee0d7</code></a> (builder) - registry: optimizing variable naming</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f9c62d9db809bfe03af33092e71a16e56fc35483"><code>f9c62d9</code></a> (controller) - domain: added reserved domain check</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/f5a135be6aa2b319e623fd59bb711705d1cfe13f"><code>f5a135b</code></a> (controller) - migrations: clean old migrations</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/4369b2c2fb6ef861978588a61efa1bfc6a4572ec"><code>4369b2c</code></a> (controller) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/1057ca59c3ae6bbd85d772f6b49b0c542d7d18c4"><code>1057ca5</code></a> (controller) - registry: remove registry_secret_prefix</li> +<li><a href="https://api.github.com/repos/drycc/controller/git/trees/d114b3e93544624a5f01b1ca71db92d0b33f4e0d"><code>d114b3e</code></a> (controller) - docker: update docker client</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/edbe9631dcfb34ed50d9e931d36506fa262b6299"><code>edbe963</code></a> (dockerbuilder) - dockerfile: change base image to alpine</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/fb35baf913ff846e08ba79d9ad8195fca1411684"><code>fb35baf</code></a> (dockerbuilder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/946dbf688474933f821f641f6c027bab68cd9e79"><code>946dbf6</code></a> (dockerbuilder) - docker: remove insecure support</li> +<li><a href="https://api.github.com/repos/drycc/dockerbuilder/git/trees/628d8532256e32a046268491f2a331dcb608b713"><code>628d853</code></a> (dockerbuilder) - proxy: add registry proxy</li> +<li><a href="https://api.github.com/repos/drycc/registry/git/trees/ff27cbdd27e9dc51ce29b6a68777888ed8737862"><code>ff27cbd</code></a> (registry) - env: remove unused env</li> +<li><a href="https://api.github.com/repos/drycc/registry-proxy/git/trees/7204d72c00b2d7360a2d3a20833d701e303a9f62"><code>7204d72</code></a> (registry-proxy) - registry: optimizing variable naming</li> +</ul> + + + + + + Blog: Welcome to Drycc + /blog/2018/10/06/welcome-to-drycc/ + Sat, 06 Oct 2018 00:00:00 +0000 + + /blog/2018/10/06/welcome-to-drycc/ + + + + <p><strong>Drycc Workflow</strong> is an open source Container as a Service (CaaS) that adds a developer-friendly layer to any <a href="http://kubernetes.io">Kubernetes</a> cluster, making it easy to deploy and manage applications.</p> +<p>We welcome your input! If you have feedback, please <a href="https://github.com/drycc/workflow/issues">submit an issue</a>. If you&rsquo;d like to participate in development, please read the &ldquo;Working on Documentation&rdquo; section below and <a href="https://github.com/drycc/workflow/pulls">submit a pull request</a>.</p> + + + + + + diff --git a/install-cli.sh b/install-cli.sh new file mode 100644 index 000000000..882aa6c3b --- /dev/null +++ b/install-cli.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +set -eo pipefail +shopt -s expand_aliases + +check_platform_arch() { + local supported="darwin-amd64 darwin-arm64 linux-amd64 linux-386 linux-arm linux-arm64 windows-386 windows-amd64" + + if ! echo "${supported}" | tr ' ' '\n' | grep -q "${PLATFORM}-${ARCH}"; then + cat < + + old_lang=$LANG + LANG=C + + old_lc_collate=$LC_COLLATE + LC_COLLATE=C + + local length="${#1}" + for (( i = 0; i < length; i++ )); do + local c="${1:i:1}" + case $c in + [a-zA-Z0-9.~_-]) printf "$c" ;; + *) printf '%%%02X' "'$c" ;; + esac + done + + LANG=$old_lang + LC_COLLATE=$old_lc_collate +} + +function install_helm { + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]] ; then + version=$(curl -Ls https://drycc-mirrors.drycc.cc/helm/helm/releases|grep /helm/helm/releases/tag/ | sed -E 's/.*\/helm\/helm\/releases\/tag\/(v[0-9\.]{1,}(-rc.[0-9]{1,})?)".*/\1/g' | head -1) + tar_name="helm-${version}-linux-${ARCH}.tar.gz" + helm_download_url="https://drycc-mirrors.drycc.cc/helm/${tar_name}" + else + version=$(curl -Ls https://github.com/helm/helm/releases|grep /helm/helm/releases/tag/ | sed -E 's/.*\/helm\/helm\/releases\/tag\/(v[0-9\.]{1,}(-rc.[0-9]{1,})?)".*/\1/g' | head -1) + tar_name="helm-${version}-linux-${ARCH}.tar.gz" + helm_download_url="https://get.helm.sh/${tar_name}" + fi + curl -fsSL -o "${tar_name}" "${helm_download_url}" + tar -zxvf "${tar_name}" + mv "linux-${ARCH}/helm" /usr/local/bin/helm + rm -rf "${tar_name}" "linux-${ARCH}" +} + +function configure_os { + echo -e "\\033[32m---> Start configuring kernel parameters\\033[0m" + if [[ "$(command -v iptables)" != "" ]] ; then + iptables -F + iptables -X + iptables -F -t nat + iptables -X -t nat + iptables -P FORWARD ACCEPT + else + # Kube hostport depends on iptables + echo -e "\\033[33m---> The iptables does not exist...\\033[0m" + exit 1 + fi + swapoff -a + sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab + mount bpffs -t bpf /sys/fs/bpf + rmem_max=$(sysctl -ne net.core.rmem_max) + if [ ! -n "$rmem_max" ] || [ 2500000 -gt $rmem_max ] ;then + echo 'net.core.rmem_max = 2500000' >> /etc/sysctl.conf + fi + nr_hugepages=$(sysctl -ne vm.nr_hugepages) + if [ ! -n "$nr_hugepages" ] || [ 1024 -gt $nr_hugepages ] ;then + echo 'vm.nr_hugepages = 1024' >> /etc/sysctl.conf + fi + max_user_instances=$(sysctl -ne fs.inotify.max_user_instances) + if [ ! -n "$max_user_instances" ] || [ 65535 -gt $max_user_instances ] ;then + echo 'fs.inotify.max_user_instances = 65535' >> /etc/sysctl.conf + fi + sysctl -p + + cpufreq=$(ls /sys/devices/system/cpu/cpu*/cpufreq >/dev/null 2>&1 || echo "false") + if [[ $cpufreq != "false" ]]; then + for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do + echo performance > $cpu + done + fi + echo -e "\\033[32m---> Configuring kernel parameters finish\\033[0m" +} + +function install_runtime { + # download crun + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]] ; then + crun_base_url="https://drycc-mirrors.drycc.cc/containers" + else + crun_base_url="https://github.com/containers" + fi + crun_version=$(curl -Ls ${crun_base_url}/crun/releases|grep /containers/crun/releases/tag/ | sed -E 's/.*\/containers\/crun\/releases\/tag\/([0-9\.]{1,}(-rc.[0-9]{1,})?)".*/\1/g' | head -1) + crun_download_url=${crun_base_url}/crun/releases/download/${crun_version}/crun-${crun_version}-linux-${ARCH} + curl -sfL "${crun_download_url}" -o /usr/local/bin/crun + chmod a+rx /usr/local/bin/crun +} + +function configure_containerd { + CONTAINERD_ETC_PATH="/var/lib/rancher/k3s/agent/etc/containerd" + CONTAINERD_CONFIG_FILE="${CONTAINERD_ETC_PATH}/config.toml.tmpl" + mkdir -p "${CONTAINERD_ETC_PATH}" + if [[ -f "${REGISTRY_FILE}" ]]; then + cat "${REGISTRY_FILE}" > "${CONTAINERD_CONFIG_FILE}" + else + cat << EOF > "${CONTAINERD_CONFIG_FILE}" +[plugins.cri.containerd] + snapshotter = "overlayfs" + default_runtime_name = "crun" + disable_snapshot_annotations = true +[plugins.cri.containerd.runtimes.crun] + runtime_type = "io.containerd.runc.v2" +[plugins.cri.containerd.runtimes.crun.options] + SystemdCgroup = true +[plugins.cri.containerd.runtimes.runc] + runtime_type = "io.containerd.runc.v2" +[plugins.cri.containerd.runtimes.runc.options] + SystemdCgroup = true +EOF + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]]; then + if [[ "$1" == "runtime" ]] ; then + cat << EOF >> "${CONTAINERD_CONFIG_FILE}" +[plugins.cri.registry.mirrors] +[plugins.cri.registry.mirrors."docker.io"] + endpoint = ["https://docker-mirror.drycc.cc", "https://registry-1.docker.io"] +EOF + else + cat << EOF >> "${CONTAINERD_CONFIG_FILE}" +[plugins.cri.registry.mirrors] +[plugins.cri.registry.mirrors."docker.io"] + endpoint = ["https://docker-mirror.drycc.cc", "https://registry-1.docker.io"] +[plugins.cri.registry.mirrors."quay.io"] + endpoint = ["https://quay-mirror.drycc.cc", "https://quay.io"] +[plugins.cri.registry.mirrors."gcr.io"] + endpoint = ["https://gcr-mirror.drycc.cc", "https://gcr.io"] +[plugins.cri.registry.mirrors."registry.k8s.io"] + endpoint = ["https://k8s-mirror.drycc.cc", "https://registry.k8s.io"] +EOF + fi + fi + fi +} + +function configure_mirrors { + echo -e "\\033[32m---> Start configuring mirrors\\033[0m" + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]] ; then + INSTALL_K3S_MIRROR="${INSTALL_DRYCC_MIRROR}" + k3s_install_url="https://drycc-mirrors.drycc.cc/get-k3s/" + K3S_RELEASE_URL=https://drycc-mirrors.drycc.cc/k3s-io/k3s/releases + export INSTALL_K3S_MIRROR + else + k3s_install_url="https://get.k3s.io" + K3S_RELEASE_URL=github.com/k3s-io/k3s/releases + fi + if [ -z "${INSTALL_K3S_VERSION}" ]; then + INSTALL_K3S_VERSION=$(curl -Ls "$K3S_RELEASE_URL" | grep /k3s-io/k3s/releases/tag/ | sed -E 's/.*\/k3s-io\/k3s\/releases\/tag\/(v[0-9\.]{1,}[rc0-9\-]{0,}%2Bk3s[0-9])".*/\1/g' | head -1) + else + INSTALL_K3S_VERSION=$(urlencode "$INSTALL_K3S_VERSION") + fi + export INSTALL_K3S_VERSION + echo -e "\\033[32m---> Configuring mirrors finish\\033[0m" +} + +function install_k3s_server { + configure_os + install_runtime + configure_mirrors + configure_containerd + INSTALL_K3S_EXEC="server ${INSTALL_K3S_EXEC} --embedded-registry --flannel-backend=none --disable-network-policy --disable=traefik --disable=servicelb --disable-kube-proxy --cluster-cidr=${CLUSTER_CIDR} --service-cidr=${SERVICE_CIDR} --cluster-domain=${CLUSTER_DOMAIN}" + if [[ -n "${K3S_DATA_DIR}" ]] ; then + INSTALL_K3S_EXEC="$INSTALL_K3S_EXEC --data-dir=${K3S_DATA_DIR}/rancher/k3s" + fi + if [[ -z "${K3S_URL}" ]] ; then + INSTALL_K3S_EXEC="$INSTALL_K3S_EXEC --cluster-init" + fi + curl -sfL "${k3s_install_url}" |INSTALL_K3S_EXEC="$INSTALL_K3S_EXEC" sh -s - + kubectl apply -f - < The path ${METALLB_CONFIG_FILE} does not exist...\\033[0m" + exit 1 + fi +} + +function install_network() { + command=${1:-"install"} + options=${2:-""} + echo -e "\\033[32m---> Start $command network...\\033[0m" + kubernetes_service_host=(`ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'`) + helm $command cilium $CHARTS_URL/cilium \ + --set endpointHealthChecking.enabled=false \ + --set healthChecking=false \ + --set operator.replicas=1 \ + --set sysctlfix.enabled=true \ + --set bpf.masquerade=true \ + --set bandwidthManager.enabled=true \ + --set bandwidthManager.bbr=true \ + --set kubeProxyReplacement=true \ + --set hubble.enabled=false \ + --set hostPort.enabled=true \ + --set k8sServiceHost=${KUBERNETES_SERVICE_HOST:-$kubernetes_service_host} \ + --set k8sServicePort=${KUBERNETES_SERVICE_PORT:-6443} \ + --set prometheus.enabled=true \ + --set operator.prometheus.enabled=true \ + --set envoy.enabled=false \ + --namespace kube-system $options --wait + echo -e "\\033[32m---> Network $command completed!\\033[0m" +} + +function install_metallb() { + check_metallb + command=${1:-"install"} + options=${2:-""} + echo -e "\\033[32m---> Start $command metallb...\\033[0m" + helm $command metallb $CHARTS_URL/metallb \ + --set speaker.frr.enabled=true \ + --namespace metallb \ + --create-namespace $options + + echo -e "\\033[32m---> Waiting metallb pods ready...\\033[0m" + kubectl wait pods -n metallb --all --for condition=Ready --timeout=600s + echo -e "\\033[32m---> Waiting metallb webhook ready...\\033[0m" + sleep 30s + + if [[ -z "${METALLB_CONFIG_FILE}" ]] ; then + echo -e "\\033[32m---> Metallb using the default configuration.\\033[0m" + kubectl apply -n metallb -f - < Metallb $command completed!\\033[0m" +} + +function install_gateway() { + command=${1:-"install"} + options=${2:-""} + echo -e "\\033[32m---> Start $command gateway...\\033[0m" + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]] ; then + gateway_api_url=https://drycc-mirrors.drycc.cc/kubernetes-sigs/gateway-api + else + gateway_api_url=https://github.com/kubernetes-sigs/gateway-api + fi + version=$(curl -Ls $gateway_api_url/releases|grep /kubernetes-sigs/gateway-api/releases/tag/ | sed -E 's/.*\/kubernetes-sigs\/gateway-api\/releases\/tag\/(v[0-9\.]{1,}(-rc[0-9]{1,})?)".*/\1/g' | head -1) + + helm repo add istio https://drycc-mirrors.drycc.cc/istio-charts + helm repo update + kubectl apply -f $gateway_api_url/releases/download/${version}/experimental-install.yaml + helm $command istio-base istio/base -n istio-system --set defaultRevision=default --create-namespace --wait $options + helm $command istio-istiod istio/istiod -n istio-system \ + --set pilot.env.PILOT_ENABLE_ALPHA_GATEWAY_API=true \ + --set pilot.env.PILOT_ENABLE_QUIC_LISTENERS=true \ + --wait $options + helm $command istio-gateway istio/gateway -n istio-gateway --create-namespace --wait $options + echo -e "\\033[32m---> Gateway $command completed!\\033[0m" +} + +function install_cert_manager() { + command=${1:-"install"} + options=${2:-""} + echo -e "\\033[32m---> Start $command cert-manager...\\033[0m" + helm $command cert-manager $CHARTS_URL/cert-manager \ + --namespace cert-manager \ + --create-namespace \ + --set clusterResourceNamespace=drycc \ + --set "extraArgs={--feature-gates=ExperimentalGatewayAPISupport=true}" \ + --set crds.enabled=true --wait $options + echo -e "\\033[32m---> Cert-manager $command completed!\\033[0m" +} + +function install_catalog() { + command=${1:-"install"} + options=${2:-""} + echo -e "\\033[32m---> Start $command catalog...\\033[0m" + helm $command catalog $CHARTS_URL/catalog \ + --set asyncBindingOperationsEnabled=true \ + --set image=registry.drycc.cc/drycc-addons/service-catalog:canary \ + --namespace catalog \ + --create-namespace --wait $options + echo -e "\\033[32m---> Catalog $command completed!\\033[0m" +} + +function install_components { + install_network + install_metallb + install_gateway + install_cert_manager + install_catalog +} + +function check_drycc { + if [[ -z "${PLATFORM_DOMAIN}" ]] ; then + echo -e "\\033[33m---> Please set the PLATFORM_DOMAIN variable.\\033[0m" + echo -e "\\033[33m---> For example:\\033[0m" + echo -e "\\033[33m---> export PLATFORM_DOMAIN=drycc.cc\\033[0m" + echo -e "\\033[33m---> And confirm that wildcard domain name resolution has been set.\\033[0m" + echo -e "\\033[33m---> For example, the current server IP is 8.8.8.8\\033[0m" + echo -e "\\033[33m---> Please point *.drycc.cc to 8.8.8.8\\033[0m" + exit 1 + fi + + if [[ -z "${DRYCC_ADMIN_USERNAME}" || -z "${DRYCC_ADMIN_PASSWORD}" ]] ; then + echo -e "\\033[33m---> Please set the DRYCC_ADMIN_USERNAME and DRYCC_ADMIN_PASSWORD variable.\\033[0m" + echo -e "\\033[33m---> For example:\\033[0m" + echo -e "\\033[33m---> export DRYCC_ADMIN_USERNAME=admin\\033[0m" + echo -e "\\033[33m---> export DRYCC_ADMIN_PASSWORD=admin\\033[0m" + echo -e "\\033[33m---> This password is used by end users to log in and manage drycc.\\033[0m" + echo -e "\\033[33m---> Please set a high security string!!!\\033[0m" + exit 1 + fi +} + +function install_drycc { + check_drycc + command=${1:-"install"} + options=${2:-""} + echo -e "\\033[32m---> Start $command workflow...\\033[0m" + RABBITMQ_USERNAME=${RABBITMQ_USERNAME:-$(cat /proc/sys/kernel/random/uuid)} + RABBITMQ_PASSWORD=${RABBITMQ_PASSWORD:-$(cat /proc/sys/kernel/random/uuid)} + if [[ "$CHANNEL" == "stable" ]]; then + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]] ; then + FILER_VERSION=$(curl -Ls https://drycc-mirrors.drycc.cc/drycc/filer/releases|grep /drycc/filer/releases/tag/ | sed -E 's/.*\/drycc\/filer\/releases\/tag\/(v[0-9\.]{1,}(-rc.[0-9]{1,})?)".*/\1/g' | head -1) + else + FILER_VERSION=$(curl -Ls https://github.com/drycc/filer/releases|grep /drycc/filer/releases/tag/ | sed -E 's/.*\/drycc\/filer\/releases\/tag\/(v[0-9\.]{1,}(-rc.[0-9]{1,})?)".*/\1/g' | head -1) + fi + FILER_IMAGE=${DRYCC_REGISTRY}/drycc/filer:$(sed 's#v##' <<< $FILER_VERSION) + FILER_IMAGE_PULL_POLICY="IfNotPresent" + else + FILER_IMAGE=${DRYCC_REGISTRY}/drycc/filer:canary + FILER_IMAGE_PULL_POLICY="Always" + fi + +cat << EOF > "/tmp/drycc-values.yaml" +global: + clusterDomain: ${CLUSTER_DOMAIN} + platformDomain: ${PLATFORM_DOMAIN} + certManagerEnabled: ${CERT_MANAGER_ENABLED} + gatewayClass: ${GATEWAY_CLASS} + +builder: + replicas: ${BUILDER_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + +database: + replicas: ${DATABASE_REPLICAS:-2} + imageRegistry: ${DRYCC_REGISTRY} + limitsMemory: "512Mi" + limitsHugepages2Mi: "256Mi" + persistence: + enabled: true + size: ${DATABASE_PERSISTENCE_SIZE:-5Gi} + storageClass: ${DATABASE_PERSISTENCE_STORAGE_CLASS:-""} + +timeseries: + replicas: ${TIMESERIES_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + limitsMemory: "512Mi" + limitsHugepages2Mi: "256Mi" + persistence: + enabled: true + size: ${TIMESERIES_PERSISTENCE_SIZE:-5Gi} + storageClass: ${TIMESERIES_PERSISTENCE_STORAGE_CLASS:-""} + +fluentbit: + imageRegistry: ${DRYCC_REGISTRY} + +controller: + apiReplicas: ${CONTROLLER_API_REPLICAS:-1} + celeryReplicas: ${CONTROLLER_CELERY_REPLICAS:-1} + webhookReplicas: ${CONTROLLER_WEBHOOK_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + appRuntimeClass: ${CONTROLLER_APP_RUNTIME_CLASS:-""} + appStorageClass: ${CONTROLLER_APP_STORAGE_CLASS:-"drycc-storage"} + filerImage: ${FILER_IMAGE} + filerImagePullPolicy: ${FILER_IMAGE_PULL_POLICY} + +redis: + replicas: ${REDIS_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + persistence: + enabled: true + size: ${REDIS_PERSISTENCE_SIZE:-5Gi} + storageClass: ${REDIS_PERSISTENCE_STORAGE_CLASS:-""} + +storage: + csi: + statefulset: + replicas: ${STORAGE_CSI_STATEFULSET_REPLICAS:-1} + mainnode: + tipd: + replicas: ${STORAGE_MAINNODE_TIPD_REPLICAS:-1} + persistence: + enabled: true + size: ${STORAGE_MAINNODE_TIPD_PERSISTENCE_SIZE:-5Gi} + storageClass: "${STORAGE_MAINNODE_TIPD_PERSISTENCE_STORAGE_CLASS}" + weed: + replicas: ${STORAGE_MAINNODE_WEED_REPLICAS:-1} + volumePreallocate: ${STORAGE_MAINNODE_WEED_PREALLOCATE:-false} + volumeSizeLimitMB: ${STORAGE_MAINNODE_WEED_SIZE_LIMIT_MB:-512} + defaultReplication: "${STORAGE_MAINNODE_WEED_DEFAULT_REPLICATION:-000}" + persistence: + enabled: true + size: ${STORAGE_MAINNODE_WEED_PERSISTENCE_SIZE:-5Gi} + storageClass: "${STORAGE_MAINNODE_WEED_PERSISTENCE_STORAGE_CLASS}" + metanode: + tikv: + replicas: ${STORAGE_METANODE_TIKV_REPLICAS:-1} + persistence: + enabled: true + size: ${STORAGE_METANODE_TIKV_PERSISTENCE_SIZE:-5Gi} + storageClass: "${STORAGE_METANODE_TIKV_PERSISTENCE_STORAGE_CLASS}" + weed: + replicas: ${STORAGE_METANODE_WEED_REPLICAS:-1} + persistence: + enabled: true + size: ${STORAGE_METANODE_WEED_PERSISTENCE_SIZE:-5Gi} + storageClass: "${STORAGE_METANODE_WEED_PERSISTENCE_STORAGE_CLASS}" + datanode: + weed: + replicas: ${STORAGE_DATANODE_WEED_REPLICAS:-1} + persistence: + enabled: true + size: ${STORAGE_DATANODE_WEED_PERSISTENCE_SIZE:-10Gi} + storageClass: "${STORAGE_DATANODE_WEED_PERSISTENCE_STORAGE_CLASS}" + +rabbitmq: + replicas: ${RABBITMQ_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + username: "${RABBITMQ_USERNAME}" + password: "${RABBITMQ_PASSWORD}" + persistence: + enabled: true + size: ${RABBITMQ_PERSISTENCE_SIZE:-5Gi} + storageClass: ${RABBITMQ_PERSISTENCE_STORAGE_CLASS:-""} + +imagebuilder: + imageRegistry: ${DRYCC_REGISTRY} + +logger: + replicas: ${LOGGER_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + +monitor: + grafana: + imageRegistry: ${DRYCC_REGISTRY} + persistence: + enabled: true + size: ${MONITOR_GRAFANA_PERSISTENCE_SIZE:-5Gi} + storageClass: ${MONITOR_GRAFANA_PERSISTENCE_STORAGE_CLASS:-""} + telegraf: + imageRegistry: ${DRYCC_REGISTRY} + +prometheus: + prometheus-server: + retention: ${PROMETHEUS_SERVER_RETENTION:-"15d"} + persistence: + enabled: true + accessMode: ReadWriteOnce + size: ${PROMETHEUS_SERVER_PERSISTENCE_SIZE:-10Gi} + storageClass: ${PROMETHEUS_SERVER_PERSISTENCE_STORAGE_CLASS:-""} + +passport: + replicas: ${PASSPORT_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + adminUsername: ${DRYCC_ADMIN_USERNAME} + adminPassword: ${DRYCC_ADMIN_PASSWORD} + +registry: + replicas: ${REGISTRY_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + +registry-proxy: + imageRegistry: ${DRYCC_REGISTRY} + +acme: + server: ${ACME_SERVER:-"https://acme-v02.api.letsencrypt.org/directory"} + externalAccountBinding: + keyID: ${ACME_EAB_KEY_ID:-""} + keySecret: ${ACME_EAB_KEY_SECRET:-""} +EOF + + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]] ; then + cat << EOF > "/tmp/drycc-mirror-values.yaml" +imagebuilder: + container_registries: | + unqualified-search-registries = ["docker.io"] + short-name-mode="permissive" + [[registry]] + prefix = "docker.io" + location = "registry-1.docker.io" + [[registry.mirror]] + prefix = "docker.io" + location = "hub-mirror.c.163.com" +EOF + else + cat << EOF > "/tmp/drycc-mirror-values.yaml" +imagebuilder: + container_registries: | + unqualified-search-registries = ["docker.io"] + short-name-mode="permissive" +EOF + fi + + helm $command drycc $CHARTS_URL/workflow \ + --namespace drycc \ + --values /tmp/drycc-values.yaml \ + --values /tmp/drycc-mirror-values.yaml \ + --create-namespace --wait --timeout 30m0s $options + echo -e "\\033[32m---> Rabbitmq username: $RABBITMQ_USERNAME\\033[0m" + echo -e "\\033[32m---> Rabbitmq password: $RABBITMQ_PASSWORD\\033[0m" + echo -e "\\033[32m---> Workflow $command completed!\\033[0m" +} + +function install_helmbroker { + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]] ; then + addons_url="https://drycc-mirrors.drycc.cc/drycc-addons/addons/releases/download/latest/index.yaml" + else + addons_url="https://github.com/drycc-addons/addons/releases/download/latest/index.yaml" + fi + command=${1:-"install"} + options=${2:-""} + HELMBROKER_USERNAME=${HELMBROKER_USERNAME:-$(cat /proc/sys/kernel/random/uuid)} + HELMBROKER_PASSWORD=${HELMBROKER_PASSWORD:-$(cat /proc/sys/kernel/random/uuid)} + + echo -e "\\033[32m---> Start $command helmbroker...\\033[0m" + + helm $command helmbroker $CHARTS_URL/helmbroker \ + --set global.rabbitmqLocation="off-cluster" \ + --set global.gatewayClass=${GATEWAY_CLASS} \ + --set global.clusterDomain=${CLUSTER_DOMAIN} \ + --set global.platformDomain=${PLATFORM_DOMAIN} \ + --set global.certManagerEnabled=${CERT_MANAGER_ENABLED} \ + --set persistence.size=${HELMBROKER_PERSISTENCE_SIZE:-5Gi} \ + --set persistence.storageClass=${HELMBROKER_PERSISTENCE_STORAGE_CLASS:-"drycc-storage"} \ + --set username=${HELMBROKER_USERNAME} \ + --set password=${HELMBROKER_PASSWORD} \ + --set replicas=${HELMBROKER_REPLICAS} \ + --set celeryReplicas=${HELMBROKER_CELERY_REPLICAS} \ + --set rabbitmqUrl="amqp://${RABBITMQ_USERNAME}:${RABBITMQ_PASSWORD}@drycc-rabbitmq.drycc.svc.${CLUSTER_DOMAIN}:5672/helmbroker" \ + --namespace drycc-helmbroker --create-namespace $options --wait -f - < Helmbroker username: $HELMBROKER_USERNAME\\033[0m" + echo -e "\\033[32m---> Helmbroker password: $HELMBROKER_PASSWORD\\033[0m" + echo -e "\\033[32m---> Helmbroker $command completed!\\033[0m" +} + +function upgrade { + RABBITMQ_USERNAME=$(kubectl get secrets -n drycc rabbitmq-creds -o jsonpath="{.data.username}"| base64 -d) + RABBITMQ_PASSWORD=$(kubectl get secrets -n drycc rabbitmq-creds -o jsonpath="{.data.password}"| base64 -d) + export RABBITMQ_USERNAME RABBITMQ_PASSWORD + + install_network upgrade --reset-then-reuse-values + install_metallb upgrade --reset-then-reuse-values + install_gateway upgrade --reset-then-reuse-values + install_cert_manager upgrade --reset-then-reuse-values + install_catalog upgrade --reset-then-reuse-values + install_drycc upgrade --reset-then-reuse-values + install_helmbroker upgrade --reset-then-reuse-values + echo -e "\\033[32m---> Upgrade complete, enjoy life...\\033[0m" +} + +export KUBECONFIG=/etc/rancher/k3s/k3s.yaml + +if [[ -z "$@" ]] ; then + check_drycc + check_metallb + install_k3s_server + install_helm + install_components + install_drycc + install_helmbroker + echo -e "\\033[32m---> Installation complete, enjoy life...\\033[0m" +else + for command in "$@" + do + $command + echo -e "\\033[32m---> Execute $command complete, enjoy life...\\033[0m" + done +fi diff --git a/js/click-to-copy.min.f724d3de49218995223b7316aa2e53e2b34bf42026bf399ebb21bb02212402d1.js b/js/click-to-copy.min.f724d3de49218995223b7316aa2e53e2b34bf42026bf399ebb21bb02212402d1.js new file mode 100644 index 000000000..26dffe3a2 --- /dev/null +++ b/js/click-to-copy.min.f724d3de49218995223b7316aa2e53e2b34bf42026bf399ebb21bb02212402d1.js @@ -0,0 +1,2 @@ +let codeListings=document.querySelectorAll(".highlight > pre");for(let t=0;t{e.setAttribute(t,o[t])}),e.classList.add("fas","fa-copy","btn","btn-dark","btn-sm","td-click-to-copy");const i=new bootstrap.Tooltip(e);e.onclick=()=>{copyCode(s),e.setAttribute("data-bs-original-title","Copied!"),i.show()},e.onmouseout=()=>{e.setAttribute("data-bs-original-title","Copy to clipboard"),i.hide()};const n=document.createElement("div");n.classList.add("click-to-copy"),n.append(e),codeListings[t].insertBefore(n,s)}const copyCode=e=>{navigator.clipboard.writeText(e.textContent.trim()+` +`)} \ No newline at end of file diff --git a/js/deflate.js b/js/deflate.js new file mode 100644 index 000000000..b452c84e9 --- /dev/null +++ b/js/deflate.js @@ -0,0 +1,1652 @@ +/* Copyright (C) 1999 Masanao Izumo +* Version: 1.0.1 +* LastModified: Dec 25 1999 +*/ + +/* Interface: +* data = deflate(src); +*/ +const deflate = (function () { + /* constant parameters */ + var zip_WSIZE = 32768; // Sliding Window size + var zip_STORED_BLOCK = 0; + var zip_STATIC_TREES = 1; + var zip_DYN_TREES = 2; + + /* for deflate */ + var zip_DEFAULT_LEVEL = 6; + var zip_FULL_SEARCH = true; + var zip_INBUFSIZ = 32768; // Input buffer size + var zip_INBUF_EXTRA = 64; // Extra buffer + var zip_OUTBUFSIZ = 1024 * 8; + var zip_window_size = 2 * zip_WSIZE; + var zip_MIN_MATCH = 3; + var zip_MAX_MATCH = 258; + var zip_BITS = 16; + // for SMALL_MEM + var zip_LIT_BUFSIZE = 0x2000; + var zip_HASH_BITS = 13; + // for MEDIUM_MEM + // var zip_LIT_BUFSIZE = 0x4000; + // var zip_HASH_BITS = 14; + // for BIG_MEM + // var zip_LIT_BUFSIZE = 0x8000; + // var zip_HASH_BITS = 15; + //if(zip_LIT_BUFSIZE > zip_INBUFSIZ) + // alert("error: zip_INBUFSIZ is too small"); + //if((zip_WSIZE<<1) > (1< zip_BITS-1) + // alert("error: zip_HASH_BITS is too large"); + //if(zip_HASH_BITS < 8 || zip_MAX_MATCH != 258) + // alert("error: Code too clever"); + var zip_DIST_BUFSIZE = zip_LIT_BUFSIZE; + var zip_HASH_SIZE = 1 << zip_HASH_BITS; + var zip_HASH_MASK = zip_HASH_SIZE - 1; + var zip_WMASK = zip_WSIZE - 1; + var zip_NIL = 0; // Tail of hash chains + var zip_TOO_FAR = 4096; + var zip_MIN_LOOKAHEAD = zip_MAX_MATCH + zip_MIN_MATCH + 1; + var zip_MAX_DIST = zip_WSIZE - zip_MIN_LOOKAHEAD; + var zip_SMALLEST = 1; + var zip_MAX_BITS = 15; + var zip_MAX_BL_BITS = 7; + var zip_LENGTH_CODES = 29; + var zip_LITERALS = 256; + var zip_END_BLOCK = 256; + var zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES; + var zip_D_CODES = 30; + var zip_BL_CODES = 19; + var zip_REP_3_6 = 16; + var zip_REPZ_3_10 = 17; + var zip_REPZ_11_138 = 18; + var zip_HEAP_SIZE = 2 * zip_L_CODES + 1; + var zip_H_SHIFT = parseInt((zip_HASH_BITS + zip_MIN_MATCH - 1) / + zip_MIN_MATCH); + + /* variables */ + var zip_free_queue; + var zip_qhead, zip_qtail; + var zip_initflag; + var zip_outbuf = null; + var zip_outcnt, zip_outoff; + var zip_complete; + var zip_window; + var zip_d_buf; + var zip_l_buf; + var zip_prev; + var zip_bi_buf; + var zip_bi_valid; + var zip_block_start; + var zip_ins_h; + var zip_hash_head; + var zip_prev_match; + var zip_match_available; + var zip_match_length; + var zip_prev_length; + var zip_strstart; + var zip_match_start; + var zip_eofile; + var zip_lookahead; + var zip_max_chain_length; + var zip_max_lazy_match; + var zip_compr_level; + var zip_good_match; + var zip_nice_match; + var zip_dyn_ltree; + var zip_dyn_dtree; + var zip_static_ltree; + var zip_static_dtree; + var zip_bl_tree; + var zip_l_desc; + var zip_d_desc; + var zip_bl_desc; + var zip_bl_count; + var zip_heap; + var zip_heap_len; + var zip_heap_max; + var zip_depth; + var zip_length_code; + var zip_dist_code; + var zip_base_length; + var zip_base_dist; + var zip_flag_buf; + var zip_last_lit; + var zip_last_dist; + var zip_last_flags; + var zip_flags; + var zip_flag_bit; + var zip_opt_len; + var zip_static_len; + var zip_deflate_data; + var zip_deflate_pos; + + /* objects (deflate) */ + + function zip_DeflateCT() { + this.fc = 0; // frequency count or bit string + this.dl = 0; // father node in Huffman tree or length of bit string + } + + function zip_DeflateTreeDesc() { + this.dyn_tree = null; // the dynamic tree + this.static_tree = null; // corresponding static tree or NULL + this.extra_bits = null; // extra bits for each code or NULL + this.extra_base = 0; // base index for extra_bits + this.elems = 0; // max number of elements in the tree + this.max_length = 0; // max bit length for the codes + this.max_code = 0; // largest code with non zero frequency + } + + /* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ + function zip_DeflateConfiguration(a, b, c, d) { + this.good_length = a; // reduce lazy search above this match length + this.max_lazy = b; // do not perform lazy search above this match length + this.nice_length = c; // quit search above this match length + this.max_chain = d; + } + + function zip_DeflateBuffer() { + this.next = null; + this.len = 0; + this.ptr = new Array(zip_OUTBUFSIZ); + this.off = 0; + } + + /* constant tables */ + var zip_extra_lbits = [ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]; + var zip_extra_dbits = [ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]; + var zip_extra_blbits = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7]; + var zip_bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; + var zip_configuration_table = [ + new zip_DeflateConfiguration(0, 0, 0, 0), + new zip_DeflateConfiguration(4, 4, 8, 4), + new zip_DeflateConfiguration(4, 5, 16, 8), + new zip_DeflateConfiguration(4, 6, 32, 32), + new zip_DeflateConfiguration(4, 4, 16, 16), + new zip_DeflateConfiguration(8, 16, 32, 32), + new zip_DeflateConfiguration(8, 16, 128, 128), + new zip_DeflateConfiguration(8, 32, 128, 256), + new zip_DeflateConfiguration(32, 128, 258, 1024), + new zip_DeflateConfiguration(32, 258, 258, 4096)]; + + + /* routines (deflate) */ + + function zip_deflate_start(level) { + var i; + + if (!level) + level = zip_DEFAULT_LEVEL; + else if (level < 1) + level = 1; + else if (level > 9) + level = 9; + + zip_compr_level = level; + zip_initflag = false; + zip_eofile = false; + if (zip_outbuf != null) + return; + + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = new Array(zip_OUTBUFSIZ); + zip_window = new Array(zip_window_size); + zip_d_buf = new Array(zip_DIST_BUFSIZE); + zip_l_buf = new Array(zip_INBUFSIZ + zip_INBUF_EXTRA); + zip_prev = new Array(1 << zip_BITS); + zip_dyn_ltree = new Array(zip_HEAP_SIZE); + for (i = 0; i < zip_HEAP_SIZE; i++) + zip_dyn_ltree[i] = new zip_DeflateCT(); + zip_dyn_dtree = new Array(2 * zip_D_CODES + 1); + for (i = 0; i < 2 * zip_D_CODES + 1; i++) + zip_dyn_dtree[i] = new zip_DeflateCT(); + zip_static_ltree = new Array(zip_L_CODES + 2); + for (i = 0; i < zip_L_CODES + 2; i++) + zip_static_ltree[i] = new zip_DeflateCT(); + zip_static_dtree = new Array(zip_D_CODES); + for (i = 0; i < zip_D_CODES; i++) + zip_static_dtree[i] = new zip_DeflateCT(); + zip_bl_tree = new Array(2 * zip_BL_CODES + 1); + for (i = 0; i < 2 * zip_BL_CODES + 1; i++) + zip_bl_tree[i] = new zip_DeflateCT(); + zip_l_desc = new zip_DeflateTreeDesc(); + zip_d_desc = new zip_DeflateTreeDesc(); + zip_bl_desc = new zip_DeflateTreeDesc(); + zip_bl_count = new Array(zip_MAX_BITS + 1); + zip_heap = new Array(2 * zip_L_CODES + 1); + zip_depth = new Array(2 * zip_L_CODES + 1); + zip_length_code = new Array(zip_MAX_MATCH - zip_MIN_MATCH + 1); + zip_dist_code = new Array(512); + zip_base_length = new Array(zip_LENGTH_CODES); + zip_base_dist = new Array(zip_D_CODES); + zip_flag_buf = new Array(parseInt(zip_LIT_BUFSIZE / 8)); + } + + function zip_deflate_end() { + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = null; + zip_window = null; + zip_d_buf = null; + zip_l_buf = null; + zip_prev = null; + zip_dyn_ltree = null; + zip_dyn_dtree = null; + zip_static_ltree = null; + zip_static_dtree = null; + zip_bl_tree = null; + zip_l_desc = null; + zip_d_desc = null; + zip_bl_desc = null; + zip_bl_count = null; + zip_heap = null; + zip_depth = null; + zip_length_code = null; + zip_dist_code = null; + zip_base_length = null; + zip_base_dist = null; + zip_flag_buf = null; + } + + function zip_reuse_queue(p) { + p.next = zip_free_queue; + zip_free_queue = p; + } + + function zip_new_queue() { + var p; + + if (zip_free_queue != null) { + p = zip_free_queue; + zip_free_queue = zip_free_queue.next; + } + else + p = new zip_DeflateBuffer(); + p.next = null; + p.len = p.off = 0; + + return p; + } + + function zip_head1(i) { + return zip_prev[zip_WSIZE + i]; + } + + function zip_head2(i, val) { + return zip_prev[zip_WSIZE + i] = val; + } + + /* put_byte is used for the compressed output, put_ubyte for the + * uncompressed output. However unlzw() uses window for its + * suffix table instead of its output buffer, so it does not use put_ubyte + * (to be cleaned up). + */ + function zip_put_byte(c) { + zip_outbuf[zip_outoff + zip_outcnt++] = c; + if (zip_outoff + zip_outcnt == zip_OUTBUFSIZ) + zip_qoutbuf(); + } + + /* Output a 16 bit value, lsb first */ + function zip_put_short(w) { + w &= 0xffff; + if (zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) { + zip_outbuf[zip_outoff + zip_outcnt++] = (w & 0xff); + zip_outbuf[zip_outoff + zip_outcnt++] = (w >>> 8); + } else { + zip_put_byte(w & 0xff); + zip_put_byte(w >>> 8); + } + } + + /* ========================================================================== + * Insert string s in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of s are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ + function zip_INSERT_STRING() { + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) + ^ (zip_window[zip_strstart + zip_MIN_MATCH - 1] & 0xff)) + & zip_HASH_MASK; + zip_hash_head = zip_head1(zip_ins_h); + zip_prev[zip_strstart & zip_WMASK] = zip_hash_head; + zip_head2(zip_ins_h, zip_strstart); + } + + /* Send a code of the given tree. c and tree must not have side effects */ + function zip_SEND_CODE(c, tree) { + zip_send_bits(tree[c].fc, tree[c].dl); + } + + /* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. dist_code[256] and dist_code[257] are never + * used. + */ + function zip_D_CODE(dist) { + return (dist < 256 ? zip_dist_code[dist] + : zip_dist_code[256 + (dist >> 7)]) & 0xff; + } + + /* ========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ + function zip_SMALLER(tree, n, m) { + return tree[n].fc < tree[m].fc || + (tree[n].fc == tree[m].fc && zip_depth[n] <= zip_depth[m]); + } + + /* ========================================================================== + * read string data + */ + function zip_read_buff(buff, offset, n) { + var i; + for (i = 0; i < n && zip_deflate_pos < zip_deflate_data.length; i++) + buff[offset + i] = + zip_deflate_data.charCodeAt(zip_deflate_pos++) & 0xff; + return i; + } + + /* ========================================================================== + * Initialize the "longest match" routines for a new file + */ + function zip_lm_init() { + var j; + + /* Initialize the hash table. */ + for (j = 0; j < zip_HASH_SIZE; j++) + // zip_head2(j, zip_NIL); + zip_prev[zip_WSIZE + j] = 0; + /* prev will be initialized on the fly */ + + /* Set the default configuration parameters: + */ + zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy; + zip_good_match = zip_configuration_table[zip_compr_level].good_length; + if (!zip_FULL_SEARCH) + zip_nice_match = zip_configuration_table[zip_compr_level].nice_length; + zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain; + + zip_strstart = 0; + zip_block_start = 0; + + zip_lookahead = zip_read_buff(zip_window, 0, 2 * zip_WSIZE); + if (zip_lookahead <= 0) { + zip_eofile = true; + zip_lookahead = 0; + return; + } + zip_eofile = false; + /* Make sure that we always have enough lookahead. This is important + * if input comes from a device such as a tty. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + + /* If lookahead < MIN_MATCH, ins_h is garbage, but this is + * not important since only literal bytes will be emitted. + */ + zip_ins_h = 0; + for (j = 0; j < zip_MIN_MATCH - 1; j++) { + // UPDATE_HASH(ins_h, window[j]); + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[j] & 0xff)) & zip_HASH_MASK; + } + } + + /* ========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + */ + function zip_longest_match(cur_match) { + var chain_length = zip_max_chain_length; // max hash chain length + var scanp = zip_strstart; // current string + var matchp; // matched string + var len; // length of current match + var best_len = zip_prev_length; // best match length so far + + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + var limit = (zip_strstart > zip_MAX_DIST ? zip_strstart - zip_MAX_DIST : zip_NIL); + + var strendp = zip_strstart + zip_MAX_MATCH; + var scan_end1 = zip_window[scanp + best_len - 1]; + var scan_end = zip_window[scanp + best_len]; + + /* Do not waste too much time if we already have a good match: */ + if (zip_prev_length >= zip_good_match) + chain_length >>= 2; + + // Assert(encoder->strstart <= window_size-MIN_LOOKAHEAD, "insufficient lookahead"); + + do { + // Assert(cur_match < encoder->strstart, "no future"); + matchp = cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2: + */ + if (zip_window[matchp + best_len] != scan_end || + zip_window[matchp + best_len - 1] != scan_end1 || + zip_window[matchp] != zip_window[scanp] || + zip_window[++matchp] != zip_window[scanp + 1]) { + continue; + } + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scanp += 2; + matchp++; + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + scanp < strendp); + + len = zip_MAX_MATCH - (strendp - scanp); + scanp = strendp - zip_MAX_MATCH; + + if (len > best_len) { + zip_match_start = cur_match; + best_len = len; + if (zip_FULL_SEARCH) { + if (len >= zip_MAX_MATCH) break; + } else { + if (len >= zip_nice_match) break; + } + + scan_end1 = zip_window[scanp + best_len - 1]; + scan_end = zip_window[scanp + best_len]; + } + } while ((cur_match = zip_prev[cur_match & zip_WMASK]) > limit + && --chain_length != 0); + + return best_len; + } + + /* ========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead, and sets eofile if end of input file. + * IN assertion: lookahead < MIN_LOOKAHEAD && strstart + lookahead > 0 + * OUT assertions: at least one byte has been read, or eofile is set; + * file reads are performed for at least two bytes (required for the + * translate_eol option). + */ + function zip_fill_window() { + var n, m; + + // Amount of free space at the end of the window. + var more = zip_window_size - zip_lookahead - zip_strstart; + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (more == -1) { + /* Very unlikely, but possible on 16 bit machine if strstart == 0 + * and lookahead == 1 (input done one byte at time) + */ + more--; + } else if (zip_strstart >= zip_WSIZE + zip_MAX_DIST) { + /* By the IN assertion, the window is not empty so we can't confuse + * more == 0 with more == 64K on a 16 bit machine. + */ + // Assert(window_size == (ulg)2*WSIZE, "no sliding with BIG_MEM"); + + // System.arraycopy(window, WSIZE, window, 0, WSIZE); + for (n = 0; n < zip_WSIZE; n++) + zip_window[n] = zip_window[n + zip_WSIZE]; + + zip_match_start -= zip_WSIZE; + zip_strstart -= zip_WSIZE; /* we now have strstart >= MAX_DIST: */ + zip_block_start -= zip_WSIZE; + + for (n = 0; n < zip_HASH_SIZE; n++) { + m = zip_head1(n); + zip_head2(n, m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); + } + for (n = 0; n < zip_WSIZE; n++) { + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + m = zip_prev[n]; + zip_prev[n] = (m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); + } + more += zip_WSIZE; + } + // At this point, more >= 2 + if (!zip_eofile) { + n = zip_read_buff(zip_window, zip_strstart + zip_lookahead, more); + if (n <= 0) + zip_eofile = true; + else + zip_lookahead += n; + } + } + + /* ========================================================================== + * Processes a new input file and return its compressed length. This + * function does not perform lazy evaluationof matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ + function zip_deflate_fast() { + while (zip_lookahead != 0 && zip_qhead == null) { + var flush; // set if current block must be flushed + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + zip_INSERT_STRING(); + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (zip_hash_head != zip_NIL && + zip_strstart - zip_hash_head <= zip_MAX_DIST) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + zip_match_length = zip_longest_match(zip_hash_head); + /* longest_match() sets match_start */ + if (zip_match_length > zip_lookahead) + zip_match_length = zip_lookahead; + } + if (zip_match_length >= zip_MIN_MATCH) { + // check_match(strstart, match_start, match_length); + + flush = zip_ct_tally(zip_strstart - zip_match_start, + zip_match_length - zip_MIN_MATCH); + zip_lookahead -= zip_match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ + if (zip_match_length <= zip_max_lazy_match) { + zip_match_length--; // string at strstart already in hash table + do { + zip_strstart++; + zip_INSERT_STRING(); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH + * these bytes are garbage, but it does not matter since + * the next lookahead bytes will be emitted as literals. + */ + } while (--zip_match_length != 0); + zip_strstart++; + } else { + zip_strstart += zip_match_length; + zip_match_length = 0; + zip_ins_h = zip_window[zip_strstart] & 0xff; + // UPDATE_HASH(ins_h, window[strstart + 1]); + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[zip_strstart + 1] & 0xff)) & zip_HASH_MASK; + + //#if MIN_MATCH != 3 + // Call UPDATE_HASH() MIN_MATCH-3 more times + //#endif + + } + } else { + /* No match, output a literal byte */ + flush = zip_ct_tally(0, zip_window[zip_strstart] & 0xff); + zip_lookahead--; + zip_strstart++; + } + if (flush) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + } + } + + function zip_deflate_better() { + /* Process the input block. */ + while (zip_lookahead != 0 && zip_qhead == null) { + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + zip_INSERT_STRING(); + + /* Find the longest match, discarding those <= prev_length. + */ + zip_prev_length = zip_match_length; + zip_prev_match = zip_match_start; + zip_match_length = zip_MIN_MATCH - 1; + + if (zip_hash_head != zip_NIL && + zip_prev_length < zip_max_lazy_match && + zip_strstart - zip_hash_head <= zip_MAX_DIST) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + zip_match_length = zip_longest_match(zip_hash_head); + /* longest_match() sets match_start */ + if (zip_match_length > zip_lookahead) + zip_match_length = zip_lookahead; + + /* Ignore a length 3 match if it is too distant: */ + if (zip_match_length == zip_MIN_MATCH && + zip_strstart - zip_match_start > zip_TOO_FAR) { + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + zip_match_length--; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (zip_prev_length >= zip_MIN_MATCH && + zip_match_length <= zip_prev_length) { + var flush; // set if current block must be flushed + + // check_match(strstart - 1, prev_match, prev_length); + flush = zip_ct_tally(zip_strstart - 1 - zip_prev_match, + zip_prev_length - zip_MIN_MATCH); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. + */ + zip_lookahead -= zip_prev_length - 1; + zip_prev_length -= 2; + do { + zip_strstart++; + zip_INSERT_STRING(); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH + * these bytes are garbage, but it does not matter since the + * next lookahead bytes will always be emitted as literals. + */ + } while (--zip_prev_length != 0); + zip_match_available = 0; + zip_match_length = zip_MIN_MATCH - 1; + zip_strstart++; + if (flush) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + } else if (zip_match_available != 0) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + if (zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff)) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + zip_strstart++; + zip_lookahead--; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + zip_match_available = 1; + zip_strstart++; + zip_lookahead--; + } + + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + } + } + + function zip_init_deflate() { + if (zip_eofile) + return; + zip_bi_buf = 0; + zip_bi_valid = 0; + zip_ct_init(); + zip_lm_init(); + + zip_qhead = null; + zip_outcnt = 0; + zip_outoff = 0; + + if (zip_compr_level <= 3) { + zip_prev_length = zip_MIN_MATCH - 1; + zip_match_length = 0; + } + else { + zip_match_length = zip_MIN_MATCH - 1; + zip_match_available = 0; + } + + zip_complete = false; + } + + /* ========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ + function zip_deflate_internal(buff, off, buff_size) { + var n; + + if (!zip_initflag) { + zip_init_deflate(); + zip_initflag = true; + if (zip_lookahead == 0) { // empty + zip_complete = true; + return 0; + } + } + + if ((n = zip_qcopy(buff, off, buff_size)) == buff_size) + return buff_size; + + if (zip_complete) + return n; + + if (zip_compr_level <= 3) // optimized for speed + zip_deflate_fast(); + else + zip_deflate_better(); + if (zip_lookahead == 0) { + if (zip_match_available != 0) + zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff); + zip_flush_block(1); + zip_complete = true; + } + return n + zip_qcopy(buff, n + off, buff_size - n); + } + + function zip_qcopy(buff, off, buff_size) { + var n, i, j; + + n = 0; + while (zip_qhead != null && n < buff_size) { + i = buff_size - n; + if (i > zip_qhead.len) + i = zip_qhead.len; + // System.arraycopy(qhead.ptr, qhead.off, buff, off + n, i); + for (j = 0; j < i; j++) + buff[off + n + j] = zip_qhead.ptr[zip_qhead.off + j]; + + zip_qhead.off += i; + zip_qhead.len -= i; + n += i; + if (zip_qhead.len == 0) { + var p; + p = zip_qhead; + zip_qhead = zip_qhead.next; + zip_reuse_queue(p); + } + } + + if (n == buff_size) + return n; + + if (zip_outoff < zip_outcnt) { + i = buff_size - n; + if (i > zip_outcnt - zip_outoff) + i = zip_outcnt - zip_outoff; + // System.arraycopy(outbuf, outoff, buff, off + n, i); + for (j = 0; j < i; j++) + buff[off + n + j] = zip_outbuf[zip_outoff + j]; + zip_outoff += i; + n += i; + if (zip_outcnt == zip_outoff) + zip_outcnt = zip_outoff = 0; + } + return n; + } + + /* ========================================================================== + * Allocate the match buffer, initialize the various tables and save the + * location of the internal file attribute (ascii/binary) and method + * (DEFLATE/STORE). + */ + function zip_ct_init() { + var n; // iterates over tree elements + var bits; // bit counter + var length; // length value + var code; // code value + var dist; // distance index + + if (zip_static_dtree[0].dl != 0) return; // ct_init already called + + zip_l_desc.dyn_tree = zip_dyn_ltree; + zip_l_desc.static_tree = zip_static_ltree; + zip_l_desc.extra_bits = zip_extra_lbits; + zip_l_desc.extra_base = zip_LITERALS + 1; + zip_l_desc.elems = zip_L_CODES; + zip_l_desc.max_length = zip_MAX_BITS; + zip_l_desc.max_code = 0; + + zip_d_desc.dyn_tree = zip_dyn_dtree; + zip_d_desc.static_tree = zip_static_dtree; + zip_d_desc.extra_bits = zip_extra_dbits; + zip_d_desc.extra_base = 0; + zip_d_desc.elems = zip_D_CODES; + zip_d_desc.max_length = zip_MAX_BITS; + zip_d_desc.max_code = 0; + + zip_bl_desc.dyn_tree = zip_bl_tree; + zip_bl_desc.static_tree = null; + zip_bl_desc.extra_bits = zip_extra_blbits; + zip_bl_desc.extra_base = 0; + zip_bl_desc.elems = zip_BL_CODES; + zip_bl_desc.max_length = zip_MAX_BL_BITS; + zip_bl_desc.max_code = 0; + + // Initialize the mapping length (0..255) -> length code (0..28) + length = 0; + for (code = 0; code < zip_LENGTH_CODES - 1; code++) { + zip_base_length[code] = length; + for (n = 0; n < (1 << zip_extra_lbits[code]); n++) + zip_length_code[length++] = code; + } + // Assert (length == 256, "ct_init: length != 256"); + + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + zip_length_code[length - 1] = code; + + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + zip_base_dist[code] = dist; + for (n = 0; n < (1 << zip_extra_dbits[code]); n++) { + zip_dist_code[dist++] = code; + } + } + // Assert (dist == 256, "ct_init: dist != 256"); + dist >>= 7; // from now on, all distances are divided by 128 + for (; code < zip_D_CODES; code++) { + zip_base_dist[code] = dist << 7; + for (n = 0; n < (1 << (zip_extra_dbits[code] - 7)); n++) + zip_dist_code[256 + dist++] = code; + } + // Assert (dist == 256, "ct_init: 256+dist != 512"); + + // Construct the codes of the static literal tree + for (bits = 0; bits <= zip_MAX_BITS; bits++) + zip_bl_count[bits] = 0; + n = 0; + while (n <= 143) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; } + while (n <= 255) { zip_static_ltree[n++].dl = 9; zip_bl_count[9]++; } + while (n <= 279) { zip_static_ltree[n++].dl = 7; zip_bl_count[7]++; } + while (n <= 287) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + zip_gen_codes(zip_static_ltree, zip_L_CODES + 1); + + /* The static distance tree is trivial: */ + for (n = 0; n < zip_D_CODES; n++) { + zip_static_dtree[n].dl = 5; + zip_static_dtree[n].fc = zip_bi_reverse(n, 5); + } + + // Initialize the first block of the first file: + zip_init_block(); + } + + /* ========================================================================== + * Initialize a new block. + */ + function zip_init_block() { + var n; // iterates over tree elements + + // Initialize the trees. + for (n = 0; n < zip_L_CODES; n++) zip_dyn_ltree[n].fc = 0; + for (n = 0; n < zip_D_CODES; n++) zip_dyn_dtree[n].fc = 0; + for (n = 0; n < zip_BL_CODES; n++) zip_bl_tree[n].fc = 0; + + zip_dyn_ltree[zip_END_BLOCK].fc = 1; + zip_opt_len = zip_static_len = 0; + zip_last_lit = zip_last_dist = zip_last_flags = 0; + zip_flags = 0; + zip_flag_bit = 1; + } + + /* ========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ + function zip_pqdownheap( + tree, // the tree to restore + k) { // node to move down + var v = zip_heap[k]; + var j = k << 1; // left son of k + + while (j <= zip_heap_len) { + // Set j to the smallest of the two sons: + if (j < zip_heap_len && + zip_SMALLER(tree, zip_heap[j + 1], zip_heap[j])) + j++; + + // Exit if v is smaller than both sons + if (zip_SMALLER(tree, v, zip_heap[j])) + break; + + // Exchange v with the smallest son + zip_heap[k] = zip_heap[j]; + k = j; + + // And continue down the tree, setting j to the left son of k + j <<= 1; + } + zip_heap[k] = v; + } + + /* ========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ + function zip_gen_bitlen(desc) { // the tree descriptor + var tree = desc.dyn_tree; + var extra = desc.extra_bits; + var base = desc.extra_base; + var max_code = desc.max_code; + var max_length = desc.max_length; + var stree = desc.static_tree; + var h; // heap index + var n, m; // iterate over the tree elements + var bits; // bit length + var xbits; // extra bits + var f; // frequency + var overflow = 0; // number of elements with bit length too large + + for (bits = 0; bits <= zip_MAX_BITS; bits++) + zip_bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[zip_heap[zip_heap_max]].dl = 0; // root of the heap + + for (h = zip_heap_max + 1; h < zip_HEAP_SIZE; h++) { + n = zip_heap[h]; + bits = tree[tree[n].dl].dl + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n].dl = bits; + // We overwrite tree[n].dl which is no longer needed + + if (n > max_code) + continue; // not a leaf node + + zip_bl_count[bits]++; + xbits = 0; + if (n >= base) + xbits = extra[n - base]; + f = tree[n].fc; + zip_opt_len += f * (bits + xbits); + if (stree != null) + zip_static_len += f * (stree[n].dl + xbits); + } + if (overflow == 0) + return; + + // This happens for example on obj2 and pic of the Calgary corpus + + // Find the first bit length which could increase: + do { + bits = max_length - 1; + while (zip_bl_count[bits] == 0) + bits--; + zip_bl_count[bits]--; // move one leaf down the tree + zip_bl_count[bits + 1] += 2; // move one overflow item as its brother + zip_bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = zip_bl_count[bits]; + while (n != 0) { + m = zip_heap[--h]; + if (m > max_code) + continue; + if (tree[m].dl != bits) { + zip_opt_len += (bits - tree[m].dl) * tree[m].fc; + tree[m].fc = bits; + } + n--; + } + } + } + + /* ========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ + function zip_gen_codes(tree, // the tree to decorate + max_code) { // largest code with non zero frequency + var next_code = new Array(zip_MAX_BITS + 1); // next code value for each bit length + var code = 0; // running code value + var bits; // bit index + var n; // code index + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= zip_MAX_BITS; bits++) { + code = ((code + zip_bl_count[bits - 1]) << 1); + next_code[bits] = code; + } + + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + // Assert (code + encoder->bl_count[MAX_BITS]-1 == (1<> 1; n >= 1; n--) + zip_pqdownheap(tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + do { + n = zip_heap[zip_SMALLEST]; + zip_heap[zip_SMALLEST] = zip_heap[zip_heap_len--]; + zip_pqdownheap(tree, zip_SMALLEST); + + m = zip_heap[zip_SMALLEST]; // m = node of next least frequency + + // keep the nodes sorted by frequency + zip_heap[--zip_heap_max] = n; + zip_heap[--zip_heap_max] = m; + + // Create a new node father of n and m + tree[node].fc = tree[n].fc + tree[m].fc; + // depth[node] = (char)(MAX(depth[n], depth[m]) + 1); + if (zip_depth[n] > zip_depth[m] + 1) + zip_depth[node] = zip_depth[n]; + else + zip_depth[node] = zip_depth[m] + 1; + tree[n].dl = tree[m].dl = node; + + // and insert the new node in the heap + zip_heap[zip_SMALLEST] = node++; + zip_pqdownheap(tree, zip_SMALLEST); + + } while (zip_heap_len >= 2); + + zip_heap[--zip_heap_max] = zip_heap[zip_SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + zip_gen_bitlen(desc); + + // The field len is now set, we can generate the bit codes + zip_gen_codes(tree, max_code); + } + + /* ========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. Updates opt_len to take into account the repeat + * counts. (The contribution of the bit length codes will be added later + * during the construction of bl_tree.) + */ + function zip_scan_tree(tree,// the tree to be scanned + max_code) { // and its largest code of non zero frequency + var n; // iterates over all tree elements + var prevlen = -1; // last emitted length + var curlen; // length of current code + var nextlen = tree[0].dl; // length of next code + var count = 0; // repeat count of the current code + var max_count = 7; // max repeat count + var min_count = 4; // min repeat count + + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } + tree[max_code + 1].dl = 0xffff; // guard + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if (++count < max_count && curlen == nextlen) + continue; + else if (count < min_count) + zip_bl_tree[curlen].fc += count; + else if (curlen != 0) { + if (curlen != prevlen) + zip_bl_tree[curlen].fc++; + zip_bl_tree[zip_REP_3_6].fc++; + } else if (count <= 10) + zip_bl_tree[zip_REPZ_3_10].fc++; + else + zip_bl_tree[zip_REPZ_11_138].fc++; + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } else if (curlen == nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + } + + /* ========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ + function zip_send_tree(tree, // the tree to be scanned + max_code) { // and its largest code of non zero frequency + var n; // iterates over all tree elements + var prevlen = -1; // last emitted length + var curlen; // length of current code + var nextlen = tree[0].dl; // length of next code + var count = 0; // repeat count of the current code + var max_count = 7; // max repeat count + var min_count = 4; // min repeat count + + /* tree[max_code+1].dl = -1; */ /* guard already set */ + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { zip_SEND_CODE(curlen, zip_bl_tree); } while (--count != 0); + } else if (curlen != 0) { + if (curlen != prevlen) { + zip_SEND_CODE(curlen, zip_bl_tree); + count--; + } + // Assert(count >= 3 && count <= 6, " 3_6?"); + zip_SEND_CODE(zip_REP_3_6, zip_bl_tree); + zip_send_bits(count - 3, 2); + } else if (count <= 10) { + zip_SEND_CODE(zip_REPZ_3_10, zip_bl_tree); + zip_send_bits(count - 3, 3); + } else { + zip_SEND_CODE(zip_REPZ_11_138, zip_bl_tree); + zip_send_bits(count - 11, 7); + } + count = 0; + prevlen = curlen; + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } else if (curlen == nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + } + + /* ========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ + function zip_build_bl_tree() { + var max_blindex; // index of last bit length code of non zero freq + + // Determine the bit length frequencies for literal and distance trees + zip_scan_tree(zip_dyn_ltree, zip_l_desc.max_code); + zip_scan_tree(zip_dyn_dtree, zip_d_desc.max_code); + + // Build the bit length tree: + zip_build_tree(zip_bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = zip_BL_CODES - 1; max_blindex >= 3; max_blindex--) { + if (zip_bl_tree[zip_bl_order[max_blindex]].dl != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + zip_opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + // Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + + return max_blindex; + } + + /* ========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ + function zip_send_all_trees(lcodes, dcodes, blcodes) { // number of codes for each tree + var rank; // index in bl_order + + // Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + // Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + // "too many codes"); + // Tracev((stderr, "\nbl counts: ")); + zip_send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt + zip_send_bits(dcodes - 1, 5); + zip_send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt + for (rank = 0; rank < blcodes; rank++) { + // Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + zip_send_bits(zip_bl_tree[zip_bl_order[rank]].dl, 3); + } + + // send the literal tree + zip_send_tree(zip_dyn_ltree, lcodes - 1); + + // send the distance tree + zip_send_tree(zip_dyn_dtree, dcodes - 1); + } + + /* ========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ + function zip_flush_block(eof) { // true if this is the last block for a file + var opt_lenb, static_lenb; // opt_len and static_len in bytes + var max_blindex; // index of last bit length code of non zero freq + var stored_len; // length of input block + + stored_len = zip_strstart - zip_block_start; + zip_flag_buf[zip_last_flags] = zip_flags; // Save the flags for the last 8 items + + // Construct the literal and distance trees + zip_build_tree(zip_l_desc); + // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + + zip_build_tree(zip_d_desc); + // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = zip_build_bl_tree(); + + // Determine the best encoding. Compute first the block length in bytes + opt_lenb = (zip_opt_len + 3 + 7) >> 3; + static_lenb = (zip_static_len + 3 + 7) >> 3; + + // Trace((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ", + // opt_lenb, encoder->opt_len, + // static_lenb, encoder->static_len, stored_len, + // encoder->last_lit, encoder->last_dist)); + + if (static_lenb <= opt_lenb) + opt_lenb = static_lenb; + if (stored_len + 4 <= opt_lenb // 4: two words for the lengths + && zip_block_start >= 0) { + var i; + + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + zip_send_bits((zip_STORED_BLOCK << 1) + eof, 3); /* send block type */ + zip_bi_windup(); /* align on byte boundary */ + zip_put_short(stored_len); + zip_put_short(~stored_len); + + // copy block + /* + p = &window[block_start]; + for(i = 0; i < stored_len; i++) + put_byte(p[i]); + */ + for (i = 0; i < stored_len; i++) + zip_put_byte(zip_window[zip_block_start + i]); + + } else if (static_lenb == opt_lenb) { + zip_send_bits((zip_STATIC_TREES << 1) + eof, 3); + zip_compress_block(zip_static_ltree, zip_static_dtree); + } else { + zip_send_bits((zip_DYN_TREES << 1) + eof, 3); + zip_send_all_trees(zip_l_desc.max_code + 1, + zip_d_desc.max_code + 1, + max_blindex + 1); + zip_compress_block(zip_dyn_ltree, zip_dyn_dtree); + } + + zip_init_block(); + + if (eof != 0) + zip_bi_windup(); + } + + /* ========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ + function zip_ct_tally( + dist, // distance of matched string + lc) { // match length-MIN_MATCH or unmatched char (if dist==0) + zip_l_buf[zip_last_lit++] = lc; + if (dist == 0) { + // lc is the unmatched char + zip_dyn_ltree[lc].fc++; + } else { + // Here, lc is the match length - MIN_MATCH + dist--; // dist = match distance - 1 + // Assert((ush)dist < (ush)MAX_DIST && + // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + // (ush)D_CODE(dist) < (ush)D_CODES, "ct_tally: bad match"); + + zip_dyn_ltree[zip_length_code[lc] + zip_LITERALS + 1].fc++; + zip_dyn_dtree[zip_D_CODE(dist)].fc++; + + zip_d_buf[zip_last_dist++] = dist; + zip_flags |= zip_flag_bit; + } + zip_flag_bit <<= 1; + + // Output the flags if they fill a byte + if ((zip_last_lit & 7) == 0) { + zip_flag_buf[zip_last_flags++] = zip_flags; + zip_flags = 0; + zip_flag_bit = 1; + } + // Try to guess if it is profitable to stop the current block here + if (zip_compr_level > 2 && (zip_last_lit & 0xfff) == 0) { + // Compute an upper bound for the compressed length + var out_length = zip_last_lit * 8; + var in_length = zip_strstart - zip_block_start; + var dcode; + + for (dcode = 0; dcode < zip_D_CODES; dcode++) { + out_length += zip_dyn_dtree[dcode].fc * (5 + zip_extra_dbits[dcode]); + } + out_length >>= 3; + // Trace((stderr,"\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ", + // encoder->last_lit, encoder->last_dist, in_length, out_length, + // 100L - out_length*100L/in_length)); + if (zip_last_dist < parseInt(zip_last_lit / 2) && + out_length < parseInt(in_length / 2)) + return true; + } + return (zip_last_lit == zip_LIT_BUFSIZE - 1 || + zip_last_dist == zip_DIST_BUFSIZE); + /* We avoid equality with LIT_BUFSIZE because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ + } + + /* ========================================================================== + * Send the block data compressed using the given Huffman trees + */ + function zip_compress_block( + ltree, // literal tree + dtree) { // distance tree + var dist; // distance of matched string + var lc; // match length or unmatched char (if dist == 0) + var lx = 0; // running index in l_buf + var dx = 0; // running index in d_buf + var fx = 0; // running index in flag_buf + var flag = 0; // current flags + var code; // the code to send + var extra; // number of extra bits to send + + if (zip_last_lit != 0) do { + if ((lx & 7) == 0) + flag = zip_flag_buf[fx++]; + lc = zip_l_buf[lx++] & 0xff; + if ((flag & 1) == 0) { + zip_SEND_CODE(lc, ltree); /* send a literal byte */ + // Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + // Here, lc is the match length - MIN_MATCH + code = zip_length_code[lc]; + zip_SEND_CODE(code + zip_LITERALS + 1, ltree); // send the length code + extra = zip_extra_lbits[code]; + if (extra != 0) { + lc -= zip_base_length[code]; + zip_send_bits(lc, extra); // send the extra length bits + } + dist = zip_d_buf[dx++]; + // Here, dist is the match distance - 1 + code = zip_D_CODE(dist); + // Assert (code < D_CODES, "bad d_code"); + + zip_SEND_CODE(code, dtree); // send the distance code + extra = zip_extra_dbits[code]; + if (extra != 0) { + dist -= zip_base_dist[code]; + zip_send_bits(dist, extra); // send the extra distance bits + } + } // literal or match pair ? + flag >>= 1; + } while (lx < zip_last_lit); + + zip_SEND_CODE(zip_END_BLOCK, ltree); + } + + /* ========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ + var zip_Buf_size = 16; // bit size of bi_buf + function zip_send_bits( + value, // value to send + length) { // number of bits + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (zip_bi_valid > zip_Buf_size - length) { + zip_bi_buf |= (value << zip_bi_valid); + zip_put_short(zip_bi_buf); + zip_bi_buf = (value >> (zip_Buf_size - zip_bi_valid)); + zip_bi_valid += length - zip_Buf_size; + } else { + zip_bi_buf |= value << zip_bi_valid; + zip_bi_valid += length; + } + } + + /* ========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ + function zip_bi_reverse( + code, // the value to invert + len) { // its bit length + var res = 0; + do { + res |= code & 1; + code >>= 1; + res <<= 1; + } while (--len > 0); + return res >> 1; + } + + /* ========================================================================== + * Write out any remaining bits in an incomplete byte. + */ + function zip_bi_windup() { + if (zip_bi_valid > 8) { + zip_put_short(zip_bi_buf); + } else if (zip_bi_valid > 0) { + zip_put_byte(zip_bi_buf); + } + zip_bi_buf = 0; + zip_bi_valid = 0; + } + + function zip_qoutbuf() { + if (zip_outcnt != 0) { + var q, i; + q = zip_new_queue(); + if (zip_qhead == null) + zip_qhead = zip_qtail = q; + else + zip_qtail = zip_qtail.next = q; + q.len = zip_outcnt - zip_outoff; + // System.arraycopy(zip_outbuf, zip_outoff, q.ptr, 0, q.len); + for (i = 0; i < q.len; i++) + q.ptr[i] = zip_outbuf[zip_outoff + i]; + zip_outcnt = zip_outoff = 0; + } + } + + return function deflate(str, level) { + var i, j; + + zip_deflate_data = str; + zip_deflate_pos = 0; + if (typeof level == "undefined") + level = zip_DEFAULT_LEVEL; + zip_deflate_start(level); + + var buff = new Array(1024); + var aout = []; + while ((i = zip_deflate_internal(buff, 0, buff.length)) > 0) { + var cbuf = new Array(i); + for (j = 0; j < i; j++) { + cbuf[j] = String.fromCharCode(buff[j]); + } + aout[aout.length] = cbuf.join(""); + } + zip_deflate_data = null; // G.C. + return aout.join(""); + }; +})(); \ No newline at end of file diff --git a/js/main.min.248655eb216150e39da254c2f7aa5357805d0ec66bdb741b591cd35fb5f629ab.js b/js/main.min.248655eb216150e39da254c2f7aa5357805d0ec66bdb741b591cd35fb5f629ab.js new file mode 100644 index 000000000..cc0a66fd8 --- /dev/null +++ b/js/main.min.248655eb216150e39da254c2f7aa5357805d0ec66bdb741b591cd35fb5f629ab.js @@ -0,0 +1,5 @@ +/*! + * Bootstrap v5.2.3 (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */(function(e,t){typeof exports=="object"&&typeof module!="undefined"?module.exports=t():typeof define=="function"&&define.amd?define(t):(e=typeof globalThis!="undefined"?globalThis:e||self,e.bootstrap=t())})(this,function(){"use strict";const ro=1e6,Jr=1e3,ut="transitionend",Xr=e=>e==null?`${e}`:Object.prototype.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase(),Gr=e=>{do e+=Math.floor(Math.random()*ro);while(document.getElementById(e))return e},ss=e=>{let t=e.getAttribute("data-bs-target");if(!t||t==="#"){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n=`#${n.split("#")[1]}`),t=n&&n!=="#"?n.trim():null}return t},ns=e=>{const t=ss(e);return t?document.querySelector(t)?t:null:null},v=e=>{const t=ss(e);return t?document.querySelector(t):null},Yr=e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e);const s=Number.parseFloat(t),o=Number.parseFloat(n);return!s&&!o?0:(t=t.split(",")[0],n=n.split(",")[0],(Number.parseFloat(t)+Number.parseFloat(n))*Jr)},es=e=>{e.dispatchEvent(new Event(ut))},g=e=>!!e&&typeof e=="object"&&(typeof e.jquery!="undefined"&&(e=e[0]),typeof e.nodeType!="undefined"),E=e=>g(e)?e.jquery?e[0]:e:typeof e=="string"&&e.length>0?document.querySelector(e):null,H=e=>{if(!g(e)||e.getClientRects().length===0)return!1;const n=getComputedStyle(e).getPropertyValue("visibility")==="visible",t=e.closest("details:not([open])");if(!t)return n;if(t!==e){const n=e.closest("summary");if(n&&n.parentNode!==t)return!1;if(n===null)return!1}return n},w=e=>!e||e.nodeType!==Node.ELEMENT_NODE||!!e.classList.contains("disabled")||(typeof e.disabled!="undefined"?e.disabled:e.hasAttribute("disabled")&&e.getAttribute("disabled")!=="false"),Jn=e=>{if(!document.documentElement.attachShadow)return null;if(typeof e.getRootNode=="function"){const t=e.getRootNode();return t instanceof ShadowRoot?t:null}return e instanceof ShadowRoot?e:e.parentNode?Jn(e.parentNode):null},Oe=()=>{},ne=e=>{e.offsetHeight},Xn=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,He=[],Pr=e=>{document.readyState==="loading"?(He.length||document.addEventListener("DOMContentLoaded",()=>{for(const e of He)e()}),He.push(e)):e()},a=()=>document.documentElement.dir==="rtl",c=e=>{Pr(()=>{const t=Xn();if(t){const n=e.NAME,s=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=s,e.jQueryInterface)}})},y=e=>{typeof e=="function"&&e()},Yn=(e,t,n=!0)=>{if(!n){y(e);return}const i=5,a=Yr(t)+i;let s=!1;const o=({target:n})=>{if(n!==t)return;s=!0,t.removeEventListener(ut,o),y(e)};t.addEventListener(ut,o),setTimeout(()=>{s||es(t)},a)},Le=(e,t,n,s)=>{const i=e.length;let o=e.indexOf(t);return o===-1?!n&&s?e[i-1]:e[0]:(o+=n?1:-1,s&&(o=(o+i)%i),e[Math.max(0,Math.min(o,i-1))])},Nr=/[^.]*(?=\..*)\.|.*/,zr=/\..*/,Tr=/::\d+$/,Ge={};let Un=1;const Vn={mouseenter:"mouseover",mouseleave:"mouseout"},Ar=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function In(e,t){return t&&`${t}::${Un++}`||e.uidEvent||Un++}function Fn(e){const t=In(e);return e.uidEvent=t,Ge[t]=Ge[t]||{},Ge[t]}function xr(t,n){return function s(o){return st(o,{delegateTarget:t}),s.oneOff&&e.off(t,o.type,n),n.apply(t,[o])}}function Or(t,n,s){return function o(i){const a=t.querySelectorAll(n);for(let{target:r}=i;r&&r!==this;r=r.parentNode)for(const c of a){if(c!==r)continue;return st(i,{delegateTarget:r}),o.oneOff&&e.off(t,i.type,n,s),s.apply(r,[i])}}}function Sn(e,t,n=null){return Object.values(e).find(e=>e.callable===t&&e.delegationSelector===n)}function En(e,t,n){const o=typeof t=="string",i=o?n:t||n;let s=On(e);return Ar.has(s)||(s=e),[o,i,s]}function Cn(e,t,n,s,o){if(typeof t!="string"||!e)return;let[r,i,c]=En(t,n,s);if(t in Vn){const e=e=>function(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return e.call(this,t)};i=e(i)}const d=Fn(e),u=d[c]||(d[c]={}),l=Sn(u,i,r?n:null);if(l){l.oneOff=l.oneOff&&o;return}const h=In(i,t.replace(Nr,"")),a=r?Or(e,n,i):xr(e,i);a.delegationSelector=r?n:null,a.callable=i,a.oneOff=o,a.uidEvent=h,u[h]=a,e.addEventListener(c,a,r)}function Me(e,t,n,s,o){const i=Sn(t[n],s,o);if(!i)return;e.removeEventListener(n,i,Boolean(o)),delete t[n][i.uidEvent]}function wr(e,t,n,s){const o=t[n]||{};for(const i of Object.keys(o))if(i.includes(s)){const s=o[i];Me(e,t,n,s.callable,s.delegationSelector)}}function On(e){return e=e.replace(zr,""),Vn[e]||e}const e={on(e,t,n,s){Cn(e,t,n,s,!1)},one(e,t,n,s){Cn(e,t,n,s,!0)},off(e,t,n,s){if(typeof t!="string"||!e)return;const[c,r,i]=En(t,n,s),l=i!==t,o=Fn(e),a=o[i]||{},d=t.startsWith(".");if(typeof r!="undefined"){if(!Object.keys(a).length)return;Me(e,o,i,r,c?n:null);return}if(d)for(const n of Object.keys(o))wr(e,o,n,t.slice(1));for(const n of Object.keys(a)){const s=n.replace(Tr,"");if(!l||t.includes(s)){const t=a[n];Me(e,o,i,t.callable,t.delegationSelector)}}},trigger(e,t,n){if(typeof t!="string"||!e)return null;const i=Xn(),l=On(t),d=t!==l;let s=null,a=!0,r=!0,c=!1;d&&i&&(s=i.Event(t,n),i(e).trigger(s),a=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),c=s.isDefaultPrevented());let o=new Event(t,{bubbles:a,cancelable:!0});return o=st(o,n),c&&o.preventDefault(),r&&e.dispatchEvent(o),o.defaultPrevented&&s&&s.preventDefault(),o}};function st(e,t){for(const[n,s]of Object.entries(t||{}))try{e[n]=s}catch{Object.defineProperty(e,n,{configurable:!0,get(){return s}})}return e}const x=new Map,it={set(e,t,n){x.has(e)||x.set(e,new Map);const s=x.get(e);if(!s.has(t)&&s.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`);return}s.set(t,n)},get(e,t){return x.has(e)?x.get(e).get(t)||null:null},remove(e,t){if(!x.has(e))return;const n=x.get(e);n.delete(t),n.size===0&&x.delete(e)}};function _n(e){if(e==="true")return!0;if(e==="false")return!1;if(e===Number(e).toString())return Number(e);if(e===""||e==="null")return null;if(typeof e!="string")return e;try{return JSON.parse(decodeURIComponent(e))}catch{return e}}function ht(e){return e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}const b={setDataAttribute(e,t,n){e.setAttribute(`data-bs-${ht(t)}`,n)},removeDataAttribute(e,t){e.removeAttribute(`data-bs-${ht(t)}`)},getDataAttributes(e){if(!e)return{};const t={},n=Object.keys(e.dataset).filter(e=>e.startsWith("bs")&&!e.startsWith("bsConfig"));for(const o of n){let s=o.replace(/^bs/,"");s=s.charAt(0).toLowerCase()+s.slice(1,s.length),t[s]=_n(e.dataset[o])}return t},getDataAttribute(e,t){return _n(e.getAttribute(`data-bs-${ht(t)}`))}};class te{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(e){return e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e}_mergeConfigObj(e,t){const n=g(t)?b.getDataAttribute(t,"config"):{};return{...this.constructor.Default,...typeof n=="object"?n:{},...g(t)?b.getDataAttributes(t):{},...typeof e=="object"?e:{}}}_typeCheckConfig(e,t=this.constructor.DefaultType){for(const n of Object.keys(t)){const s=t[n],o=e[n],i=g(o)?"element":Xr(o);if(!new RegExp(s).test(i))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${i}" but expected type "${s}".`)}}}const _r="5.2.3";class u extends te{constructor(e,t){if(super(),e=E(e),!e)return;this._element=e,this._config=this._getConfig(t),it.set(this._element,this.constructor.DATA_KEY,this)}dispose(){it.remove(this._element,this.constructor.DATA_KEY),e.off(this._element,this.constructor.EVENT_KEY);for(const e of Object.getOwnPropertyNames(this))this[e]=null}_queueCallback(e,t,n=!0){Yn(e,t,n)}_getConfig(e){return e=this._mergeConfigObj(e,this._element),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}static getInstance(e){return it.get(E(e),this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,typeof t=="object"?t:null)}static get VERSION(){return _r}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(e){return`${e}${this.EVENT_KEY}`}}const Se=(t,n="hide")=>{const o=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;e.on(document,o,`[data-bs-dismiss="${s}"]`,function(e){if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),w(this))return;const o=v(this)||this.closest(`.${s}`),i=t.getOrCreateInstance(o);i[n]()})},jr="alert",dr="bs.alert",vn=`.${dr}`,rr=`close${vn}`,Ja=`closed${vn}`,Qa="fade",Ga="show";class de extends u{static get NAME(){return jr}close(){const t=e.trigger(this._element,rr);if(t.defaultPrevented)return;this._element.classList.remove(Ga);const n=this._element.classList.contains(Qa);this._queueCallback(()=>this._destroyElement(),this._element,n)}_destroyElement(){this._element.remove(),e.trigger(this._element,Ja),this.dispose()}static jQueryInterface(e){return this.each(function(){const t=de.getOrCreateInstance(this);if(typeof e!="string")return;if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)})}}Se(de,"close"),c(de);const Ka="button",$a="bs.button",Ia=`.${$a}`,Da=".data-api",ba="active",fn='[data-bs-toggle="button"]',va=`click${Ia}${Da}`;class fe extends u{static get NAME(){return Ka}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(ba))}static jQueryInterface(e){return this.each(function(){const t=fe.getOrCreateInstance(this);e==="toggle"&&t[e]()})}}e.on(document,va,fn,e=>{e.preventDefault();const t=e.target.closest(fn),n=fe.getOrCreateInstance(t);n.toggle()}),c(fe);const t={find(e,t=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(t,e))},findOne(e,t=document.documentElement){return Element.prototype.querySelector.call(t,e)},children(e,t){return[].concat(...e.children).filter(e=>e.matches(t))},parents(e,t){const s=[];let n=e.parentNode.closest(t);for(;n;)s.push(n),n=n.parentNode.closest(t);return s},prev(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return[n];n=n.previousElementSibling}return[]},next(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return[n];n=n.nextElementSibling}return[]},focusableChildren(e){const t=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(e=>`${e}:not([tabindex^="-"])`).join(",");return this.find(t,e).filter(e=>!w(e)&&H(e))}},ga="swipe",$=".bs.swipe",pa=`touchstart${$}`,ma=`touchmove${$}`,ua=`touchend${$}`,na=`pointerdown${$}`,Xi=`pointerup${$}`,$i="touch",Vi="pen",Pi="pointer-event",Li=40,Ni={endCallback:null,leftCallback:null,rightCallback:null},Di={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Re extends te{constructor(e,t){if(super(),this._element=e,!e||!Re.isSupported())return;this._config=this._getConfig(t),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents()}static get Default(){return Ni}static get DefaultType(){return Di}static get NAME(){return ga}dispose(){e.off(this._element,$)}_start(e){if(!this._supportPointerEvents){this._deltaX=e.touches[0].clientX;return}this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX)}_end(e){this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX-this._deltaX),this._handleSwipe(),y(this._config.endCallback)}_move(e){this._deltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this._deltaX}_handleSwipe(){const e=Math.abs(this._deltaX);if(e<=Li)return;const t=e/this._deltaX;if(this._deltaX=0,!t)return;y(t>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(e.on(this._element,na,e=>this._start(e)),e.on(this._element,Xi,e=>this._end(e)),this._element.classList.add(Pi)):(e.on(this._element,pa,e=>this._start(e)),e.on(this._element,ma,e=>this._move(e)),e.on(this._element,ua,e=>this._end(e)))}_eventIsPointerPenTouch(e){return this._supportPointerEvents&&(e.pointerType===Vi||e.pointerType===$i)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const is="carousel",Mi="bs.carousel",k=`.${Mi}`,Wt=".data-api",ki="ArrowLeft",yi="ArrowRight",ji=500,Z="next",K="prev",P="left",Ae="right",vi=`slide${k}`,Ve=`slid${k}`,di=`keydown${k}`,li=`mouseenter${k}`,oi=`mouseleave${k}`,ti=`dragstart${k}`,Zo=`load${k}${Wt}`,qo=`click${k}${Wt}`,Lt="carousel",ye="active",Wo="slide",Bo="carousel-item-end",Io="carousel-item-start",Po="carousel-item-next",Ro="carousel-item-prev",Mt=".active",Ct=".carousel-item",Lo=Mt+Ct,No=".carousel-item img",Do=".carousel-indicators",zo="[data-bs-slide], [data-bs-slide-to]",To='[data-bs-ride="carousel"]',bo={[ki]:Ae,[yi]:P},go={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},lo={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class ie extends u{constructor(e,n){super(e,n),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=t.findOne(Do,this._element),this._addEventListeners(),this._config.ride===Lt&&this.cycle()}static get Default(){return go}static get DefaultType(){return lo}static get NAME(){return is}next(){this._slide(Z)}nextWhenVisible(){!document.hidden&&H(this._element)&&this.next()}prev(){this._slide(K)}pause(){this._isSliding&&es(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(!this._config.ride)return;if(this._isSliding){e.one(this._element,Ve,()=>this.cycle());return}this.cycle()}to(t){const n=this._getItems();if(t>n.length-1||t<0)return;if(this._isSliding){e.one(this._element,Ve,()=>this.to(t));return}const s=this._getItemIndex(this._getActive());if(s===t)return;const o=t>s?Z:K;this._slide(o,n[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(e){return e.defaultInterval=e.interval,e}_addEventListeners(){this._config.keyboard&&e.on(this._element,di,e=>this._keydown(e)),this._config.pause==="hover"&&(e.on(this._element,li,()=>this.pause()),e.on(this._element,oi,()=>this._maybeEnableCycle())),this._config.touch&&Re.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const n of t.find(No,this._element))e.on(n,ti,e=>e.preventDefault());const n=()=>{if(this._config.pause!=="hover")return;this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),ji+this._config.interval)},s={leftCallback:()=>this._slide(this._directionToOrder(P)),rightCallback:()=>this._slide(this._directionToOrder(Ae)),endCallback:n};this._swipeHelper=new Re(this._element,s)}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;const t=bo[e.key];t&&(e.preventDefault(),this._slide(this._directionToOrder(t)))}_getItemIndex(e){return this._getItems().indexOf(e)}_setActiveIndicatorElement(e){if(!this._indicatorsElement)return;const s=t.findOne(Mt,this._indicatorsElement);s.classList.remove(ye),s.removeAttribute("aria-current");const n=t.findOne(`[data-bs-slide-to="${e}"]`,this._indicatorsElement);n&&(n.classList.add(ye),n.setAttribute("aria-current","true"))}_updateInterval(){const e=this._activeElement||this._getActive();if(!e)return;const t=Number.parseInt(e.getAttribute("data-bs-interval"),10);this._config.interval=t||this._config.defaultInterval}_slide(t,n=null){if(this._isSliding)return;const o=this._getActive(),a=t===Z,s=n||Le(this._getItems(),o,a,this._config.wrap);if(s===o)return;const c=this._getItemIndex(s),l=n=>e.trigger(this._element,n,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(o),to:c}),d=l(vi);if(d.defaultPrevented)return;if(!o||!s)return;const u=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(c),this._activeElement=s;const i=a?Io:Bo,r=a?Po:Ro;s.classList.add(r),ne(s),o.classList.add(i),s.classList.add(i);const h=()=>{s.classList.remove(i,r),s.classList.add(ye),o.classList.remove(ye,r,i),this._isSliding=!1,l(Ve)};this._queueCallback(h,o,this._isAnimated()),u&&this.cycle()}_isAnimated(){return this._element.classList.contains(Wo)}_getActive(){return t.findOne(Lo,this._element)}_getItems(){return t.find(Ct,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(e){return a()?e===P?K:Z:e===P?Z:K}_orderToDirection(e){return a()?e===K?P:Ae:e===K?Ae:P}static jQueryInterface(e){return this.each(function(){const t=ie.getOrCreateInstance(this,e);if(typeof e=="number"){t.to(e);return}if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}}e.on(document,qo,zo,function(e){const n=v(this);if(!n||!n.classList.contains(Lt))return;e.preventDefault();const t=ie.getOrCreateInstance(n),s=this.getAttribute("data-bs-slide-to");if(s){t.to(s),t._maybeEnableCycle();return}if(b.getDataAttribute(this,"slide")==="next"){t.next(),t._maybeEnableCycle();return}t.prev(),t._maybeEnableCycle()}),e.on(window,Zo,()=>{const e=t.find(To);for(const t of e)ie.getOrCreateInstance(t)}),c(ie);const os="collapse",ao="bs.collapse",ee=`.${ao}`,eo=".data-api",Zs=`show${ee}`,Xs=`shown${ee}`,Gs=`hide${ee}`,qs=`hidden${ee}`,Ks=`click${ee}${eo}`,rt="show",V="collapse",je="collapsing",Us="collapsed",Ws=`:scope .${V} .${V}`,$s="collapse-horizontal",Vs="width",Bs="height",Is=".collapse.show, .collapse.collapsing",et='[data-bs-toggle="collapse"]',Hs={parent:null,toggle:!0},Ps={parent:"(null|element)",toggle:"boolean"};class le extends u{constructor(e,n){super(e,n),this._isTransitioning=!1,this._triggerArray=[];const s=t.find(et);for(const e of s){const n=ns(e),o=t.find(n).filter(e=>e===this._element);n!==null&&o.length&&this._triggerArray.push(e)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Hs}static get DefaultType(){return Ps}static get NAME(){return os}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let n=[];if(this._config.parent&&(n=this._getFirstLevelChildren(Is).filter(e=>e!==this._element).map(e=>le.getOrCreateInstance(e,{toggle:!1}))),n.length&&n[0]._isTransitioning)return;const s=e.trigger(this._element,Zs);if(s.defaultPrevented)return;for(const e of n)e.hide();const t=this._getDimension();this._element.classList.remove(V),this._element.classList.add(je),this._element.style[t]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const o=()=>{this._isTransitioning=!1,this._element.classList.remove(je),this._element.classList.add(V,rt),this._element.style[t]="",e.trigger(this._element,Xs)},i=t[0].toUpperCase()+t.slice(1),a=`scroll${i}`;this._queueCallback(o,this._element,!0),this._element.style[t]=`${this._element[a]}px`}hide(){if(this._isTransitioning||!this._isShown())return;const n=e.trigger(this._element,Gs);if(n.defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,ne(this._element),this._element.classList.add(je),this._element.classList.remove(V,rt);for(const e of this._triggerArray){const t=v(e);t&&!this._isShown(t)&&this._addAriaAndCollapsedClass([e],!1)}this._isTransitioning=!0;const s=()=>{this._isTransitioning=!1,this._element.classList.remove(je),this._element.classList.add(V),e.trigger(this._element,qs)};this._element.style[t]="",this._queueCallback(s,this._element,!0)}_isShown(e=this._element){return e.classList.contains(rt)}_configAfterMerge(e){return e.toggle=Boolean(e.toggle),e.parent=E(e.parent),e}_getDimension(){return this._element.classList.contains($s)?Vs:Bs}_initializeChildren(){if(!this._config.parent)return;const e=this._getFirstLevelChildren(et);for(const t of e){const n=v(t);n&&this._addAriaAndCollapsedClass([t],this._isShown(n))}}_getFirstLevelChildren(e){const n=t.find(Ws,this._config.parent);return t.find(e,this._config.parent).filter(e=>!n.includes(e))}_addAriaAndCollapsedClass(e,t){if(!e.length)return;for(const n of e)n.classList.toggle(Us,!t),n.setAttribute("aria-expanded",t)}static jQueryInterface(e){const t={};return typeof e=="string"&&/show|hide/.test(e)&&(t.toggle=!1),this.each(function(){const n=le.getOrCreateInstance(this,t);if(typeof e=="string"){if(typeof n[e]=="undefined")throw new TypeError(`No method named "${e}"`);n[e]()}})}}e.on(document,Ks,et,function(e){(e.target.tagName==="A"||e.delegateTarget&&e.delegateTarget.tagName==="A")&&e.preventDefault();const n=ns(this),s=t.find(n);for(const e of s)le.getOrCreateInstance(e,{toggle:!1}).toggle()}),c(le);var O,z,s="top",se,Ln,Bn,ae,Gn,Qn,Je,St,At,kt,Et,he,o="bottom",i="right",n="left",xe="auto",G=[s,o,i,n],F="start",W="end",$t="clippingParents",ze="viewport",L="popper",Kt="reference",Ie=G.reduce(function(e,t){return e.concat([t+"-"+F,t+"-"+W])},[]),Be=[].concat(G,[xe]).reduce(function(e,t){return e.concat([t,t+"-"+F,t+"-"+W])},[]),Gt="beforeRead",Xt="read",Qt="afterRead",Zt="beforeMain",Jt="main",en="afterMain",tn="beforeWrite",nn="write",sn="afterWrite",on=[Gt,Xt,Qt,Zt,Jt,en,tn,nn,sn];function f(e){return e?(e.nodeName||"").toLowerCase():null}function r(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var t=e.ownerDocument;return t?t.defaultView||window:window}return e}function D(e){var t=r(e).Element;return e instanceof t||e instanceof Element}function l(e){var t=r(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function Ye(e){if(typeof ShadowRoot=="undefined")return!1;var t=r(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}function Ss(e){var t=e.state;Object.keys(t.elements).forEach(function(e){var o=t.styles[e]||{},s=t.attributes[e]||{},n=t.elements[e];if(!l(n)||!f(n))return;Object.assign(n.style,o),Object.keys(s).forEach(function(e){var t=s[e];t===!1?n.removeAttribute(e):n.setAttribute(e,t===!0?"":t)})})}function Es(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(e){var s=t.elements[e],o=t.attributes[e]||{},i=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]),a=i.reduce(function(e,t){return e[t]="",e},{});if(!l(s)||!f(s))return;Object.assign(s.style,a),Object.keys(o).forEach(function(e){s.removeAttribute(e)})})}}const Ze={name:"applyStyles",enabled:!0,phase:"write",fn:Ss,effect:Es,requires:["computeStyles"]};function m(e){return e.split("-")[0]}O=Math.max,se=Math.min,z=Math.round;function nt(){var e=navigator.userAgentData;return e!=null&&e.brands?e.brands.map(function(e){return e.brand+"/"+e.version}).join(" "):navigator.userAgent}function jn(){return!/^((?!chrome|android).)*safari/i.test(nt())}function X(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!1),s=e.getBoundingClientRect(),o=1,i=1,t&&l(e)&&(o=e.offsetWidth>0?z(s.width)/e.offsetWidth||1:1,i=e.offsetHeight>0?z(s.height)/e.offsetHeight||1:1);var s,o,i,f=D(e)?r(e):window,a=f.visualViewport,u=!jn()&&n,c=(s.left+(u&&a?a.offsetLeft:0))/o,d=(s.top+(u&&a?a.offsetTop:0))/i,h=s.width/o,m=s.height/i;return{width:h,height:m,top:d,right:c+h,bottom:d+m,left:c,x:c,y:d}}function dt(e){var t=X(e),n=e.offsetWidth,s=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-s)<=1&&(s=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:s}}function wn(e,t){var n,s=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(s&&Ye(s)){n=t;do{if(n&&e.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function p(e){return r(e).getComputedStyle(e)}function xs(e){return["table","td","th"].indexOf(f(e))>=0}function _(e){return((D(e)?e.ownerDocument:e.document)||window.document).documentElement}function ve(e){return f(e)==="html"?e:e.assignedSlot||e.parentNode||(Ye(e)?e.host:null)||_(e)}function kn(e){return!l(e)||p(e).position==="fixed"?null:e.offsetParent}function _s(e){var t,n,o,s=/firefox/i.test(nt()),i=/Trident/i.test(nt());if(i&&l(e)&&(o=p(e),o.position==="fixed"))return null;for(t=ve(e),Ye(t)&&(t=t.host);l(t)&&["html","body"].indexOf(f(t))<0;){if(n=p(t),n.transform!=="none"||n.perspective!=="none"||n.contain==="paint"||["transform","perspective"].indexOf(n.willChange)!==-1||s&&n.willChange==="filter"||s&&n.filter&&n.filter!=="none")return t;t=t.parentNode}return null}function re(e){for(var n=r(e),t=kn(e);t&&xs(t)&&p(t).position==="static";)t=kn(t);return t&&(f(t)==="html"||f(t)==="body"&&p(t).position==="static")?n:t||_s(e)||n}function Ue(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function oe(e,t,n){return O(e,se(t,n))}function js(e,t,n){var s=oe(e,t,n);return s>n?n:s}function zn(){return{top:0,right:0,bottom:0,left:0}}function Dn(e){return Object.assign({},zn(),e)}function Nn(e,t){return t.reduce(function(t,n){return t[n]=e,t},{})}Ln=function(t,n){return t=typeof t=="function"?t(Object.assign({},n.rects,{placement:n.placement})):t,Dn(typeof t!="number"?t:Nn(t,G))};function bs(e){var r,c,d,u,p,g,v,b,j,y,_,O,x,C,E,t=e.state,S=e.name,A=e.options,h=t.elements.arrow,f=t.modifiersData.popperOffsets,w=m(t.placement),a=Ue(w),k=[n,i].indexOf(w)>=0,l=k?"height":"width";if(!h||!f)return;g=Ln(A.padding,t),v=dt(h),b=a==="y"?s:n,j=a==="y"?o:i,y=t.rects.reference[l]+t.rects.reference[a]-f[a]-t.rects.popper[l],_=f[a]-t.rects.reference[a],c=re(h),p=c?a==="y"?c.clientHeight||0:c.clientWidth||0:0,O=y/2-_/2,x=g[b],C=p-v[l]-g[j],u=p/2-v[l]/2+O,d=oe(x,u,C),E=a,t.modifiersData[S]=(r={},r[E]=d,r.centerOffset=d-u,r)}function vs(e){var n=e.state,o=e.options,s=o.element,t=s===void 0?"[data-popper-arrow]":s;if(t==null)return;if(typeof t=="string"&&(t=n.elements.popper.querySelector(t),!t))return;if(!wn(n.elements.popper,t))return;n.elements.arrow=t}const Hn={name:"arrow",enabled:!0,phase:"main",fn:bs,effect:vs,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Q(e){return e.split("-")[1]}Bn={top:"auto",right:"auto",bottom:"auto",left:"auto"};function ms(e){var n=e.x,s=e.y,o=window,t=o.devicePixelRatio||1;return{x:z(n*t)/t||0,y:z(s*t)/t||0}}function $n(e){var c,u,h,b,j,y,x,T,z,f=e.popper,D=e.popperRect,d=e.placement,k=e.variation,m=e.offsets,S=e.position,v=e.gpuAcceleration,A=e.adaptive,w=e.roundOffsets,L=e.isFixed,N=m.x,t=N===void 0?0:N,M=m.y,a=M===void 0?0:M,E=typeof w=="function"?w({x:t,y:a}):{x:t,y:a},t=E.x,a=E.y,F=m.hasOwnProperty("x"),C=m.hasOwnProperty("y"),O=n,g=s,l=window;return A&&(c=re(f),y="clientHeight",j="clientWidth",c===r(f)&&(c=_(f),p(c).position!=="static"&&S==="absolute"&&(y="scrollHeight",j="scrollWidth")),c=c,(d===s||(d===n||d===i)&&k===W)&&(g=o,T=L&&c===l&&l.visualViewport?l.visualViewport.height:c[y],a-=T-D.height,a*=v?1:-1),(d===n||(d===s||d===o)&&k===W)&&(O=i,z=L&&c===l&&l.visualViewport?l.visualViewport.width:c[j],t-=z-D.width,t*=v?1:-1)),x=Object.assign({position:S},A&&Bn),b=w===!0?ms({x:t,y:a}):{x:t,y:a},t=b.x,a=b.y,v?Object.assign({},x,(h={},h[g]=C?"0":"",h[O]=F?"0":"",h.transform=(l.devicePixelRatio||1)<=1?"translate("+t+"px, "+a+"px)":"translate3d("+t+"px, "+a+"px, 0)",h)):Object.assign({},x,(u={},u[g]=C?a+"px":"",u[O]=F?t+"px":"",u.transform="",u))}function hs(e){var t=e.state,n=e.options,s=n.gpuAcceleration,c=s===void 0||s,o=n.adaptive,l=o===void 0||o,i=n.roundOffsets,a=i===void 0||i,r={placement:m(t.placement),variation:Q(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:c,isFixed:t.options.strategy==="fixed"};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,$n(Object.assign({},r,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:l,roundOffsets:a})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,$n(Object.assign({},r,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:a})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}const Te={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:hs,data:{}};ae={passive:!0};function ls(e){var n=e.state,t=e.instance,s=e.options,o=s.scroll,i=o===void 0||o,a=s.resize,c=a===void 0||a,l=r(n.elements.popper),d=[].concat(n.scrollParents.reference,n.scrollParents.popper);return i&&d.forEach(function(e){e.addEventListener("scroll",t.update,ae)}),c&&l.addEventListener("resize",t.update,ae),function(){i&&d.forEach(function(e){e.removeEventListener("scroll",t.update,ae)}),c&&l.removeEventListener("resize",t.update,ae)}}const Pe={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:ls,data:{}};Gn={left:"right",right:"left",bottom:"top",top:"bottom"};function ke(e){return e.replace(/left|right|bottom|top/g,function(e){return Gn[e]})}Qn={start:"end",end:"start"};function Zn(e){return e.replace(/start|end/g,function(e){return Qn[e]})}function Ke(e){var t=r(e),n=t.pageXOffset,s=t.pageYOffset;return{scrollLeft:n,scrollTop:s}}function qe(e){return X(_(e)).left+Ke(e).scrollLeft}function rs(e,t){var s,d=r(e),o=_(e),n=d.visualViewport,i=o.clientWidth,a=o.clientHeight,c=0,l=0;return n&&(i=n.width,a=n.height,s=jn(),(s||!s&&t==="fixed")&&(c=n.offsetLeft,l=n.offsetTop)),{width:i,height:a,x:c+qe(e),y:l}}function Fi(e){var s,n=_(e),o=Ke(e),t=(s=e.ownerDocument)==null?void 0:s.body,i=O(n.scrollWidth,n.clientWidth,t?t.scrollWidth:0,t?t.clientWidth:0),r=O(n.scrollHeight,n.clientHeight,t?t.scrollHeight:0,t?t.clientHeight:0),a=-o.scrollLeft+qe(e),c=-o.scrollTop;return p(t||n).direction==="rtl"&&(a+=O(n.clientWidth,t?t.clientWidth:0)-i),{width:i,height:r,x:a,y:c}}function at(e){var t=p(e),n=t.overflow,s=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+s)}function zt(e){return["html","body","#document"].indexOf(f(e))>=0?e.ownerDocument.body:l(e)&&at(e)?e:zt(ve(e))}function ce(e,t){t===void 0&&(t=[]);var s,n=zt(e),o=n===((s=e.ownerDocument)==null?void 0:s.body),i=r(n),a=o?[i].concat(i.visualViewport||[],at(n)?n:[]):n,c=t.concat(a);return o?c:c.concat(ce(ve(a)))}function Fe(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function cs(e,t){var n=X(e,!1,t==="fixed");return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}function qn(e,t,n){return t===ze?Fe(rs(e,n)):D(t)?cs(t,n):Fe(Fi(_(e)))}function ds(e){var n=ce(ve(e)),s=["absolute","fixed"].indexOf(p(e).position)>=0,t=s&&l(e)?re(e):e;return D(t)?n.filter(function(e){return D(e)&&wn(e,t)&&f(e)!=="body"}):[]}function us(e,t,n,s){var a=t==="clippingParents"?ds(e):[].concat(t),i=[].concat(a,[n]),r=i[0],o=i.reduce(function(t,n){var o=qn(e,n,s);return t.top=O(o.top,t.top),t.right=se(o.right,t.right),t.bottom=se(o.bottom,t.bottom),t.left=O(o.left,t.left),t},qn(e,r,s));return o.width=o.right-o.left,o.height=o.bottom-o.top,o.x=o.left,o.y=o.top,o}function Wn(e){var a,r,l,t=e.reference,c=e.element,d=e.placement,u=d?m(d):null,p=d?Q(d):null,h=t.x+t.width/2-c.width/2,f=t.y+t.height/2-c.height/2;switch(u){case s:a={x:h,y:t.y-c.height};break;case o:a={x:h,y:t.y+t.height};break;case i:a={x:t.x+t.width,y:f};break;case n:a={x:t.x-c.width,y:f};break;default:a={x:t.x,y:t.y}}if(r=u?Ue(u):null,r!=null)switch(l=r==="y"?"height":"width",p){case F:a[r]=a[r]-(t[l]/2-c[l]/2);break;case W:a[r]=a[r]+(t[l]/2-c[l]/2);break}return a}function I(e,t){t===void 0&&(t={});var w,n=t,v=n.placement,j=v===void 0?e.placement:v,f=n.strategy,T=f===void 0?e.strategy:f,p=n.boundary,E=p===void 0?$t:p,x=n.rootBoundary,F=x===void 0?ze:x,C=n.elementContext,c=C===void 0?L:C,m=n.altBoundary,M=m!==void 0&&m,b=n.padding,d=b===void 0?0:b,a=Dn(typeof d!="number"?d:Nn(d,G)),S=c===L?Kt:L,O=e.rects.popper,h=e.elements[M?S:c],r=us(D(h)?h:h.contextElement||_(e.elements.popper),E,F,T),y=X(e.elements.reference),k=Wn({reference:y,element:O,strategy:"absolute",placement:j}),A=Fe(Object.assign({},O,k)),l=c===L?A:y,u={top:r.top-l.top+a.top,bottom:l.bottom-r.bottom+a.bottom,left:r.left-l.left+a.left,right:l.right-r.right+a.right},g=e.modifiersData.offset;return c===L&&g&&(w=g[j],Object.keys(u).forEach(function(e){var t=[i,o].indexOf(e)>=0?1:-1,n=[s,o].indexOf(e)>=0?"y":"x";u[e]+=w[n]*t})),u}function fs(e,t){t===void 0&&(t={});var s,n=t,c=n.placement,l=n.boundary,d=n.rootBoundary,u=n.padding,h=n.flipVariations,i=n.allowedAutoPlacements,f=i===void 0?Be:i,a=Q(c),r=a?h?Ie:Ie.filter(function(e){return Q(e)===a}):G,o=r.filter(function(e){return f.indexOf(e)>=0});return o.length===0&&(o=r),s=o.reduce(function(t,n){return t[n]=I(e,{placement:n,boundary:l,rootBoundary:d,padding:u})[m(n)],t},{}),Object.keys(s).sort(function(e,t){return s[e]-s[t]})}function ps(e){if(m(e)===xe)return[];var t=ke(e);return[Zn(e),t,Zn(t)]}function gs(e){var r,c,l,u,h,g,v,y,_,x,E,k,z,t=e.state,a=e.options,C=e.name;if(t.modifiersData[C]._skip)return;for(var M=a.mainAxis,H=M===void 0||M,D=a.altAxis,R=D===void 0||D,L=a.fallbackPlacements,N=a.padding,w=a.boundary,O=a.rootBoundary,B=a.altBoundary,T=a.flipVariations,j=T===void 0||T,V=a.allowedAutoPlacements,d=t.options.placement,U=m(d),P=U===d,K=L||(P||!j?[ke(d)]:ps(d)),p=[d].concat(K).reduce(function(e,n){return e.concat(m(n)===xe?fs(t,{placement:n,boundary:w,rootBoundary:O,padding:N,flipVariations:j,allowedAutoPlacements:V}):n)},[]),W=t.rects.reference,$=t.rects.popper,A=new Map,S=!0,f=p[0],b=0;b=0,_=y?"width":"height",h=I(t,{placement:r,boundary:w,rootBoundary:O,altBoundary:B,padding:N}),l=y?g?i:n:g?o:s,W[_]>$[_]&&(l=ke(l)),z=ke(l),c=[],H&&c.push(h[v]<=0),R&&c.push(h[l]<=0,h[z]<=0),c.every(function(e){return e})){f=r,S=!1;break}A.set(r,c)}if(S)for(k=j?3:1,E=function(t){var n=p.find(function(e){var n=A.get(e);if(n)return n.slice(0,t).every(function(e){return e})});if(n)return f=n,"break"},u=k;u>0;u--)if(x=E(u),x==="break")break;t.placement!==f&&(t.modifiersData[C]._skip=!0,t.placement=f,t.reset=!0)}const Pn={name:"flip",enabled:!0,phase:"main",fn:gs,requiresIfExists:["offset"],data:{_skip:!1}};function Rn(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Tn(e){return[s,i,o,n].some(function(t){return e[t]>=0})}function ys(e){var t=e.state,a=e.name,r=t.rects.reference,c=t.rects.popper,l=t.modifiersData.preventOverflow,d=I(t,{elementContext:"reference"}),u=I(t,{altBoundary:!0}),n=Rn(d,r),s=Rn(u,c,l),o=Tn(n),i=Tn(s);t.modifiersData[a]={referenceClippingOffsets:n,popperEscapeOffsets:s,isReferenceHidden:o,hasPopperEscaped:i},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":o,"data-popper-escaped":i})}const An={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:ys};function ws(e,t,o){var c=m(e),d=[n,s].indexOf(c)>=0?-1:1,l=typeof o=="function"?o(Object.assign({},t,{placement:e})):o,a=l[0],r=l[1],a=a||0,r=(r||0)*d;return[n,i].indexOf(c)>=0?{x:r,y:a}:{x:a,y:r}}function Os(e){var t=e.state,i=e.options,a=e.name,n=i.offset,r=n===void 0?[0,0]:n,s=Be.reduce(function(e,n){return e[n]=ws(n,t.rects,r),e},{}),o=s[t.placement],c=o.x,l=o.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=c,t.modifiersData.popperOffsets.y+=l),t.modifiersData[a]=s}const xn={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:Os};function Cs(e){var t=e.state,n=e.name;t.modifiersData[n]=Wn({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})}const Qe={name:"popperOffsets",enabled:!0,phase:"read",fn:Cs,data:{}};function ks(e){return e==="x"?"y":"x"}function As(e){var r,c,h,p,v,w,C,k,A,M,T,z,D,L,R,P,H,B,V,$,W,U,K,q,Y,G,X,Z,t=e.state,l=e.options,be=e.name,fe,ue,ee,te,ie,ce,le,me,pe=l.mainAxis,ge=pe===void 0||pe,ne=l.altAxis,we=ne!==void 0&&ne,_e=l.boundary,ye=l.rootBoundary,ve=l.altBoundary,je=l.padding,de=l.tether,d=de===void 0||de,ae=l.tetherOffset,S=ae===void 0?0:ae,x=I(t,{boundary:_e,rootBoundary:ye,padding:je,altBoundary:ve}),J=m(t.placement),E=Q(t.placement),he=!E,a=Ue(J),j=ks(a),b=t.modifiersData.popperOffsets,u=t.rects.reference,g=t.rects.popper,_=typeof S=="function"?S(Object.assign({},t.rects,{placement:t.placement})):S,f=typeof _=="number"?{mainAxis:_,altAxis:_}:Object.assign({mainAxis:0,altAxis:0},_),y=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,N={x:0,y:0};if(!b)return;ge&&(R=a==="y"?s:n,P=a==="y"?o:i,r=a==="y"?"height":"width",h=b[a],V=h+x[R],$=h-x[P],W=d?-g[r]/2:0,Z=E===F?u[r]:g[r],X=E===F?-g[r]:-u[r],q=t.elements.arrow,ue=d&&q?dt(q):{width:0,height:0},k=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:zn(),K=k[R],U=k[P],v=oe(0,u[r],ue[r]),ee=he?u[r]/2-W-v-K-f.mainAxis:Z-v-K-f.mainAxis,te=he?-u[r]/2+W+v+U+f.mainAxis:X+v+U+f.mainAxis,C=t.elements.arrow&&re(t.elements.arrow),ie=C?a==="y"?C.clientTop||0:C.clientLeft||0:0,B=(fe=y?.[a])!=null?fe:0,ce=h+ee-B-ie,le=h+te-B,H=oe(d?se(V,ce):V,h,d?O($,le):$),b[a]=H,N[a]=H-h),we&&(Y=a==="x"?s:n,me=a==="x"?o:i,c=b[j],p=j==="y"?"height":"width",L=c+x[Y],D=c-x[me],w=[s,n].indexOf(J)!==-1,z=(G=y?.[j])!=null?G:0,T=w?L:c-u[p]-g[p]-z+f.altAxis,M=w?c+u[p]+g[p]-z-f.altAxis:D,A=d&&w?js(T,c,M):oe(d?T:L,c,d?M:D),b[j]=A,N[j]=A-c),t.modifiersData[be]=N}const un={name:"preventOverflow",enabled:!0,phase:"main",fn:As,requiresIfExists:["offset"]};function Ms(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function Fs(e){return e===r(e)||!l(e)?Ke(e):Ms(e)}function Ts(e){var t=e.getBoundingClientRect(),n=z(t.width)/e.offsetWidth||1,s=z(t.height)/e.offsetHeight||1;return n!==1||s!==1}function zs(e,t,n){n===void 0&&(n=!1);var r=l(t),c=l(t)&&Ts(t),i=_(t),o=X(e,c,n),a={scrollLeft:0,scrollTop:0},s={x:0,y:0};return(r||!r&&!n)&&((f(t)!=="body"||at(i))&&(a=Fs(t)),l(t)?(s=X(t,!0),s.x+=t.clientLeft,s.y+=t.clientTop):i&&(s.x=qe(i))),{x:o.left+a.scrollLeft-s.x,y:o.top+a.scrollTop-s.y,width:o.width,height:o.height}}function Ds(e){var n=new Map,t=new Set,s=[];e.forEach(function(e){n.set(e.name,e)});function o(e){t.add(e.name);var i=[].concat(e.requires||[],e.requiresIfExists||[]);i.forEach(function(e){if(!t.has(e)){var s=n.get(e);s&&o(s)}}),s.push(e)}return e.forEach(function(e){t.has(e.name)||o(e)}),s}function Ns(e){var t=Ds(e);return on.reduce(function(e,n){return e.concat(t.filter(function(e){return e.phase===n}))},[])}function Ls(e){var t;return function(){return t||(t=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})})),t}}function Rs(e){var t=e.reduce(function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e},{});return Object.keys(t).map(function(e){return t[e]})}Je={placement:"bottom",modifiers:[],strategy:"absolute"};function Tt(){for(var t=arguments.length,n=new Array(t),e=0;eNumber.parseInt(e,10)):typeof e=="function"?t=>e(t,this._element):e}_getPopperConfig(){const e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(b.setDataAttribute(this._menu,"popper","static"),e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,...typeof this._config.popperConfig=="function"?this._config.popperConfig(e):this._config.popperConfig}}_selectMenuItem({key:e,target:n}){const s=t.find(_o,this._menu).filter(e=>H(e));if(!s.length)return;Le(s,n,e===gt,!s.includes(n)).focus()}static jQueryInterface(e){return this.each(function(){const t=h.getOrCreateInstance(this,e);if(typeof e!="string")return;if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()})}static clearMenus(e){if(e.button===to||e.type==="keyup"&&e.key!==vt)return;const n=t.find(vo);for(const a of n){const t=h.getInstance(a);if(!t||t._config.autoClose===!1)continue;const s=e.composedPath(),o=s.includes(t._menu);if(s.includes(t._element)||t._config.autoClose==="inside"&&!o||t._config.autoClose==="outside"&&o)continue;if(t._menu.contains(e.target)&&(e.type==="keyup"&&e.key===vt||/input|select|option|textarea|form/i.test(e.target.tagName)))continue;const i={relatedTarget:t._element};e.type==="click"&&(i.clickEvent=e),t._completeHide(i)}}static dataApiKeydownHandler(e){const a=/input|textarea/i.test(e.target.tagName),s=e.key===Qs,o=[Js,gt].includes(e.key);if(!o&&!s)return;if(a&&!s)return;e.preventDefault();const i=this.matches(S)?this:t.prev(this,S)[0]||t.next(this,S)[0]||t.findOne(S,e.delegateTarget.parentNode),n=h.getOrCreateInstance(i);if(o){e.stopPropagation(),n.show(),n._selectMenuItem(e);return}n._isShown()&&(e.stopPropagation(),n.hide(),i.focus())}}e.on(document,jt,S,h.dataApiKeydownHandler),e.on(document,jt,be,h.dataApiKeydownHandler),e.on(document,bt,h.clearMenus),e.on(document,co,h.clearMenus),e.on(document,bt,S,function(e){e.preventDefault(),h.getOrCreateInstance(this).toggle()}),c(h);const wt=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Ot=".sticky-top",me="padding-right",xt="margin-right";class tt{constructor(){this._element=document.body}getWidth(){const e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){const e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,me,t=>t+e),this._setElementAttributes(wt,me,t=>t+e),this._setElementAttributes(Ot,xt,t=>t-e)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,me),this._resetElementAttributes(wt,me),this._resetElementAttributes(Ot,xt)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,n){const s=this.getWidth(),o=e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+s)return;this._saveInitialAttribute(e,t);const o=window.getComputedStyle(e).getPropertyValue(t);e.style.setProperty(t,`${n(Number.parseFloat(o))}px`)};this._applyManipulationCallback(e,o)}_saveInitialAttribute(e,t){const n=e.style.getPropertyValue(t);n&&b.setDataAttribute(e,t,n)}_resetElementAttributes(e,t){const n=e=>{const n=b.getDataAttribute(e,t);if(n===null){e.style.removeProperty(t);return}b.removeDataAttribute(e,t),e.style.setProperty(t,n)};this._applyManipulationCallback(e,n)}_applyManipulationCallback(e,n){if(g(e)){n(e);return}for(const s of t.find(e,this._element))n(s)}}const Ft="backdrop",Ho="fade",pt="show",Dt=`mousedown.bs.${Ft}`,Vo={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},$o={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Nt extends te{constructor(e){super(),this._config=this._getConfig(e),this._isAppended=!1,this._element=null}static get Default(){return Vo}static get DefaultType(){return $o}static get NAME(){return Ft}show(e){if(!this._config.isVisible){y(e);return}this._append();const t=this._getElement();this._config.isAnimated&&ne(t),t.classList.add(pt),this._emulateAnimation(()=>{y(e)})}hide(e){if(!this._config.isVisible){y(e);return}this._getElement().classList.remove(pt),this._emulateAnimation(()=>{this.dispose(),y(e)})}dispose(){if(!this._isAppended)return;e.off(this._element,Dt),this._element.remove(),this._isAppended=!1}_getElement(){if(!this._element){const e=document.createElement("div");e.className=this._config.className,this._config.isAnimated&&e.classList.add(Ho),this._element=e}return this._element}_configAfterMerge(e){return e.rootElement=E(e.rootElement),e}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),e.on(t,Dt,()=>{y(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(e){Yn(e,this._getElement(),this._config.isAnimated)}}const Uo="focustrap",Ko="bs.focustrap",_e=`.${Ko}`,Yo=`focusin${_e}`,Go=`keydown.tab${_e}`,Xo="Tab",Qo="forward",Rt="backward",Jo={autofocus:!0,trapElement:null},ei={autofocus:"boolean",trapElement:"element"};class Pt extends te{constructor(e){super(),this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Jo}static get DefaultType(){return ei}static get NAME(){return Uo}activate(){if(this._isActive)return;this._config.autofocus&&this._config.trapElement.focus(),e.off(document,_e),e.on(document,Yo,e=>this._handleFocusin(e)),e.on(document,Go,e=>this._handleKeydown(e)),this._isActive=!0}deactivate(){if(!this._isActive)return;this._isActive=!1,e.off(document,_e)}_handleFocusin(e){const{trapElement:n}=this._config;if(e.target===document||e.target===n||n.contains(e.target))return;const s=t.focusableChildren(n);s.length===0?n.focus():this._lastTabNavDirection===Rt?s[s.length-1].focus():s[0].focus()}_handleKeydown(e){if(e.key!==Xo)return;this._lastTabNavDirection=e.shiftKey?Rt:Qo}}const ni="modal",si="bs.modal",d=`.${si}`,ii=".data-api",ai="Escape",ri=`hide${d}`,ci=`hidePrevented${d}`,Ht=`hidden${d}`,It=`show${d}`,ui=`shown${d}`,hi=`resize${d}`,mi=`click.dismiss${d}`,fi=`mousedown.dismiss${d}`,pi=`keydown.dismiss${d}`,gi=`click${d}${ii}`,Bt="modal-open",bi="fade",Vt="show",Ne="modal-static",_i=".modal.show",wi=".modal-dialog",Oi=".modal-body",xi='[data-bs-toggle="modal"]',Ci={backdrop:!0,focus:!0,keyboard:!0},Ei={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class B extends u{constructor(e,n){super(e,n),this._dialog=t.findOne(wi,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new tt,this._addEventListeners()}static get Default(){return Ci}static get DefaultType(){return Ei}static get NAME(){return ni}toggle(e){return this._isShown?this.hide():this.show(e)}show(t){if(this._isShown||this._isTransitioning)return;const n=e.trigger(this._element,It,{relatedTarget:t});if(n.defaultPrevented)return;this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Bt),this._adjustDialog(),this._backdrop.show(()=>this._showElement(t))}hide(){if(!this._isShown||this._isTransitioning)return;const t=e.trigger(this._element,ri);if(t.defaultPrevented)return;this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Vt),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated())}dispose(){for(const t of[window,this._dialog])e.off(t,d);this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Nt({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Pt({trapElement:this._element})}_showElement(n){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const s=t.findOne(Oi,this._dialog);s&&(s.scrollTop=0),ne(this._element),this._element.classList.add(Vt);const o=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,e.trigger(this._element,ui,{relatedTarget:n})};this._queueCallback(o,this._dialog,this._isAnimated())}_addEventListeners(){e.on(this._element,pi,e=>{if(e.key!==ai)return;if(this._config.keyboard){e.preventDefault(),this.hide();return}this._triggerBackdropTransition()}),e.on(window,hi,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),e.on(this._element,fi,t=>{e.one(this._element,mi,e=>{if(this._element!==t.target||this._element!==e.target)return;if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(Bt),this._resetAdjustments(),this._scrollBar.reset(),e.trigger(this._element,Ht)})}_isAnimated(){return this._element.classList.contains(bi)}_triggerBackdropTransition(){const n=e.trigger(this._element,ci);if(n.defaultPrevented)return;const s=this._element.scrollHeight>document.documentElement.clientHeight,t=this._element.style.overflowY;if(t==="hidden"||this._element.classList.contains(Ne))return;s||(this._element.style.overflowY="hidden"),this._element.classList.add(Ne),this._queueCallback(()=>{this._element.classList.remove(Ne),this._queueCallback(()=>{this._element.style.overflowY=t},this._dialog)},this._dialog),this._element.focus()}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),n=e>0;if(n&&!t){const t=a()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!n&&t){const t=a()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){const n=B.getOrCreateInstance(this,e);if(typeof e!="string")return;if(typeof n[e]=="undefined")throw new TypeError(`No method named "${e}"`);n[e](t)})}}e.on(document,gi,xi,function(n){const s=v(this);["A","AREA"].includes(this.tagName)&&n.preventDefault(),e.one(s,It,t=>{if(t.defaultPrevented)return;e.one(s,Ht,()=>{H(this)&&this.focus()})});const o=t.findOne(_i);o&&B.getInstance(o).hide();const i=B.getOrCreateInstance(s);i.toggle(this)}),Se(B),c(B);const Ai="offcanvas",Si="bs.offcanvas",j=`.${Si}`,Ut=".data-api",Ti=`load${j}${Ut}`,zi="Escape",qt="show",Yt="showing",an="hiding",Ri="offcanvas-backdrop",rn=".offcanvas.show",Hi=`show${j}`,Ii=`shown${j}`,Bi=`hide${j}`,cn=`hidePrevented${j}`,ln=`hidden${j}`,Wi=`resize${j}`,Ui=`click${j}${Ut}`,Ki=`keydown.dismiss${j}`,qi='[data-bs-toggle="offcanvas"]',Yi={backdrop:!0,keyboard:!0,scroll:!1},Gi={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class A extends u{constructor(e,t){super(e,t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Yi}static get DefaultType(){return Gi}static get NAME(){return Ai}toggle(e){return this._isShown?this.hide():this.show(e)}show(t){if(this._isShown)return;const n=e.trigger(this._element,Hi,{relatedTarget:t});if(n.defaultPrevented)return;this._isShown=!0,this._backdrop.show(),this._config.scroll||(new tt).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Yt);const s=()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(qt),this._element.classList.remove(Yt),e.trigger(this._element,Ii,{relatedTarget:t})};this._queueCallback(s,this._element,!0)}hide(){if(!this._isShown)return;const t=e.trigger(this._element,Bi);if(t.defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(an),this._backdrop.hide();const n=()=>{this._element.classList.remove(qt,an),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new tt).reset(),e.trigger(this._element,ln)};this._queueCallback(n,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const n=()=>{if(this._config.backdrop==="static"){e.trigger(this._element,cn);return}this.hide()},t=Boolean(this._config.backdrop);return new Nt({className:Ri,isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?n:null})}_initializeFocusTrap(){return new Pt({trapElement:this._element})}_addEventListeners(){e.on(this._element,Ki,t=>{if(t.key!==zi)return;if(!this._config.keyboard){e.trigger(this._element,cn);return}this.hide()})}static jQueryInterface(e){return this.each(function(){const t=A.getOrCreateInstance(this,e);if(typeof e!="string")return;if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)})}}e.on(document,Ui,qi,function(n){const s=v(this);if(["A","AREA"].includes(this.tagName)&&n.preventDefault(),w(this))return;e.one(s,ln,()=>{H(this)&&this.focus()});const o=t.findOne(rn);o&&o!==s&&A.getInstance(o).hide();const i=A.getOrCreateInstance(s);i.toggle(this)}),e.on(window,Ti,()=>{for(const e of t.find(rn))A.getOrCreateInstance(e).show()}),e.on(window,Wi,()=>{for(const e of t.find("[aria-modal][class*=show][class*=offcanvas-]"))getComputedStyle(e).position!=="fixed"&&A.getOrCreateInstance(e).hide()}),Se(A),c(A);const Qi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Zi=/^aria-[\w-]*$/i,Ji=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,ea=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,ta=(e,t)=>{const n=e.nodeName.toLowerCase();return t.includes(n)?!Qi.has(n)||Boolean(Ji.test(e.nodeValue)||ea.test(e.nodeValue)):t.filter(e=>e instanceof RegExp).some(e=>e.test(n))},dn={"*":["class","dir","id","lang","role",Zi],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]};function sa(e,t,n){if(!e.length)return e;if(n&&typeof n=="function")return n(e);const o=new window.DOMParser,s=o.parseFromString(e,"text/html"),i=[].concat(...s.body.querySelectorAll("*"));for(const e of i){const n=e.nodeName.toLowerCase();if(!Object.keys(t).includes(n)){e.remove();continue}const s=[].concat(...e.attributes),o=[].concat(t["*"]||[],t[n]||[]);for(const t of s)ta(t,o)||e.removeAttribute(t.nodeName)}return s.body.innerHTML}const oa="TemplateFactory",ia={allowList:dn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},aa={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},ra={entry:"(string|element|function|null)",selector:"(string|element)"};class ca extends te{constructor(e){super(),this._config=this._getConfig(e)}static get Default(){return ia}static get DefaultType(){return aa}static get NAME(){return oa}getContent(){return Object.values(this._config.content).map(e=>this._resolvePossibleFunction(e)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(e){return this._checkContent(e),this._config.content={...this._config.content,...e},this}toHtml(){const e=document.createElement("div");e.innerHTML=this._maybeSanitize(this._config.template);for(const[t,n]of Object.entries(this._config.content))this._setContent(e,n,t);const t=e.children[0],n=this._resolvePossibleFunction(this._config.extraClass);return n&&t.classList.add(...n.split(" ")),t}_typeCheckConfig(e){super._typeCheckConfig(e),this._checkContent(e.content)}_checkContent(e){for(const[t,n]of Object.entries(e))super._typeCheckConfig({selector:t,entry:n},ra)}_setContent(e,n,s){const o=t.findOne(s,e);if(!o)return;if(n=this._resolvePossibleFunction(n),!n){o.remove();return}if(g(n)){this._putElementInTemplate(E(n),o);return}if(this._config.html){o.innerHTML=this._maybeSanitize(n);return}o.textContent=n}_maybeSanitize(e){return this._config.sanitize?sa(e,this._config.allowList,this._config.sanitizeFn):e}_resolvePossibleFunction(e){return typeof e=="function"?e(this):e}_putElementInTemplate(e,t){if(this._config.html){t.innerHTML="",t.append(e);return}t.textContent=e.textContent}}const la="tooltip",da=new Set(["sanitize","allowList","sanitizeFn"]),Xe="fade",ha="modal",ue="show",fa=".tooltip-inner",hn=`.${ha}`,mn="hide.bs.modal",J="hover",ot="focus",ja="click",ya="manual",_a="hide",wa="hidden",Oa="show",xa="shown",Ca="inserted",Ea="click",ka="focusin",Aa="focusout",Sa="mouseenter",Ma="mouseleave",Fa={AUTO:"auto",TOP:"top",RIGHT:a()?"left":"right",BOTTOM:"bottom",LEFT:a()?"right":"left"},Ta={allowList:dn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,0],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},za={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class U extends u{constructor(e,t){if(typeof _t=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e,t),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Ta}static get DefaultType(){return za}static get NAME(){return la}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(!this._isEnabled)return;if(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()){this._leave();return}this._enter()}dispose(){clearTimeout(this._timeout),e.off(this._element.closest(hn),mn,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const n=e.trigger(this._element,this.constructor.eventName(Oa)),s=Jn(this._element),o=(s||this._element.ownerDocument.documentElement).contains(this._element);if(n.defaultPrevented||!o)return;this._disposePopper();const t=this._getTipElement();this._element.setAttribute("aria-describedby",t.getAttribute("id"));const{container:i}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(i.append(t),e.trigger(this._element,this.constructor.eventName(Ca))),this._popper=this._createPopper(t),t.classList.add(ue),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))e.on(t,"mouseover",Oe);const a=()=>{e.trigger(this._element,this.constructor.eventName(xa)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(a,this.tip,this._isAnimated())}hide(){if(!this._isShown())return;const t=e.trigger(this._element,this.constructor.eventName(_a));if(t.defaultPrevented)return;const n=this._getTipElement();if(n.classList.remove(ue),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))e.off(t,"mouseover",Oe);this._activeTrigger[ja]=!1,this._activeTrigger[ot]=!1,this._activeTrigger[J]=!1,this._isHovered=null;const s=()=>{if(this._isWithActiveTrigger())return;this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),e.trigger(this._element,this.constructor.eventName(wa))};this._queueCallback(s,this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(e){const t=this._getTemplateFactory(e).toHtml();if(!t)return null;t.classList.remove(Xe,ue),t.classList.add(`bs-${this.constructor.NAME}-auto`);const n=Gr(this.constructor.NAME).toString();return t.setAttribute("id",n),this._isAnimated()&&t.classList.add(Xe),t}setContent(e){this._newContent=e,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(e){return this._templateFactory?this._templateFactory.changeContent(e):this._templateFactory=new ca({...this._config,content:e,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[fa]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(e){return this.constructor.getOrCreateInstance(e.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Xe)}_isShown(){return this.tip&&this.tip.classList.contains(ue)}_createPopper(e){const t=typeof this._config.placement=="function"?this._config.placement.call(this,e,this._element):this._config.placement,n=Fa[t.toUpperCase()];return he(this._element,e,this._getPopperConfig(n))}_getOffset(){const{offset:e}=this._config;return typeof e=="string"?e.split(",").map(e=>Number.parseInt(e,10)):typeof e=="function"?t=>e(t,this._element):e}_resolvePossibleFunction(e){return typeof e=="function"?e.call(this._element):e}_getPopperConfig(e){const t={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:e=>{this._getTipElement().setAttribute("data-popper-placement",e.state.placement)}}]};return{...t,...typeof this._config.popperConfig=="function"?this._config.popperConfig(t):this._config.popperConfig}}_setListeners(){const t=this._config.trigger.split(" ");for(const n of t)if(n==="click")e.on(this._element,this.constructor.eventName(Ea),this._config.selector,e=>{const t=this._initializeOnDelegatedTarget(e);t.toggle()});else if(n!==ya){const t=n===J?this.constructor.eventName(Sa):this.constructor.eventName(ka),s=n===J?this.constructor.eventName(Ma):this.constructor.eventName(Aa);e.on(this._element,t,this._config.selector,e=>{const t=this._initializeOnDelegatedTarget(e);t._activeTrigger[e.type==="focusin"?ot:J]=!0,t._enter()}),e.on(this._element,s,this._config.selector,e=>{const t=this._initializeOnDelegatedTarget(e);t._activeTrigger[e.type==="focusout"?ot:J]=t._element.contains(e.relatedTarget),t._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},e.on(this._element.closest(hn),mn,this._hideModalHandler)}_fixTitle(){const e=this._element.getAttribute("title");if(!e)return;!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",e),this._element.setAttribute("data-bs-original-title",e),this._element.removeAttribute("title")}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){if(this._isWithActiveTrigger())return;this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide)}_setTimeout(e,t){clearTimeout(this._timeout),this._timeout=setTimeout(e,t)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(e){const t=b.getDataAttributes(this._element);for(const e of Object.keys(t))da.has(e)&&delete t[e];return e={...t,...typeof e=="object"&&e?e:{}},e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e.container=e.container===!1?document.body:E(e.container),typeof e.delay=="number"&&(e.delay={show:e.delay,hide:e.delay}),typeof e.title=="number"&&(e.title=e.title.toString()),typeof e.content=="number"&&(e.content=e.content.toString()),e}_getDelegateConfig(){const e={};for(const t in this._config)this.constructor.Default[t]!==this._config[t]&&(e[t]=this._config[t]);return e.selector=!1,e.trigger="manual",e}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(e){return this.each(function(){const t=U.getOrCreateInstance(this,e);if(typeof e!="string")return;if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()})}}c(U);const Na="popover",La=".popover-header",Ra=".popover-body",Pa={...U.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},Ha={...U.DefaultType,content:"(null|string|element|function)"};class ct extends U{static get Default(){return Pa}static get DefaultType(){return Ha}static get NAME(){return Na}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[La]:this._getTitle(),[Ra]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(e){return this.each(function(){const t=ct.getOrCreateInstance(this,e);if(typeof e!="string")return;if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()})}}c(ct);const Ba="scrollspy",Va="bs.scrollspy",lt=`.${Va}`,Wa=".data-api",Ua=`activate${lt}`,pn=`click${lt}`,qa=`load${lt}${Wa}`,Ya="dropdown-item",q="active",Xa='[data-bs-spy="scroll"]',mt="[href]",Za=".nav, .list-group",gn=".nav-link",er=".nav-item",tr=".list-group-item",nr=`${gn}, ${er} > ${gn}, ${tr}`,sr=".dropdown",or=".dropdown-toggle",ir={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},ar={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Ee extends u{constructor(e,t){super(e,t),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ir}static get DefaultType(){return ar}static get NAME(){return Ba}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const e of this._observableSections.values())this._observer.observe(e)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(e){return e.target=E(e.target)||document.body,e.rootMargin=e.offset?`${e.offset}px 0px -30%`:e.rootMargin,typeof e.threshold=="string"&&(e.threshold=e.threshold.split(",").map(e=>Number.parseFloat(e))),e}_maybeEnableSmoothScroll(){if(!this._config.smoothScroll)return;e.off(this._config.target,pn),e.on(this._config.target,pn,mt,e=>{const t=this._observableSections.get(e.target.hash);if(t){e.preventDefault();const n=this._rootElement||window,s=t.offsetTop-this._element.offsetTop;if(n.scrollTo){n.scrollTo({top:s,behavior:"smooth"});return}n.scrollTop=s}})}_getNewObserver(){const e={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(e=>this._observerCallback(e),e)}_observerCallback(e){const n=e=>this._targetLinks.get(`#${e.target.id}`),s=e=>{this._previousScrollData.visibleEntryTop=e.target.offsetTop,this._process(n(e))},t=(this._rootElement||document.documentElement).scrollTop,o=t>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=t;for(const i of e){if(!i.isIntersecting){this._activeTarget=null,this._clearActiveClass(n(i));continue}const a=i.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(o&&a){if(s(i),!t)return;continue}!o&&!a&&s(i)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const e=t.find(mt,this._config.target);for(const n of e){if(!n.hash||w(n))continue;const s=t.findOne(n.hash,this._element);H(s)&&(this._targetLinks.set(n.hash,n),this._observableSections.set(n.hash,s))}}_process(t){if(this._activeTarget===t)return;this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(q),this._activateParents(t),e.trigger(this._element,Ua,{relatedTarget:t})}_activateParents(e){if(e.classList.contains(Ya)){t.findOne(or,e.closest(sr)).classList.add(q);return}for(const n of t.parents(e,Za))for(const e of t.prev(n,nr))e.classList.add(q)}_clearActiveClass(e){e.classList.remove(q);const n=t.find(`${mt}.${q}`,e);for(const e of n)e.classList.remove(q)}static jQueryInterface(e){return this.each(function(){const t=Ee.getOrCreateInstance(this,e);if(typeof e!="string")return;if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()})}}e.on(window,qa,()=>{for(const e of t.find(Xa))Ee.getOrCreateInstance(e)}),c(Ee);const cr="tab",lr="bs.tab",M=`.${lr}`,ur=`hide${M}`,hr=`hidden${M}`,mr=`show${M}`,fr=`shown${M}`,pr=`click${M}`,gr=`keydown${M}`,vr=`load${M}`,br="ArrowLeft",bn="ArrowRight",yr="ArrowUp",yn="ArrowDown",N="active",Mn="fade",We="show",Cr="dropdown",Er=".dropdown-toggle",kr=".dropdown-menu",$e=":not(.dropdown-toggle)",Sr='.list-group, .nav, [role="tablist"]',Mr=".nav-item, .list-group-item",Fr=`.nav-link${$e}, .list-group-item${$e}, [role="tab"]${$e}`,Kn='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',De=`${Fr}, ${Kn}`,Dr=`.${N}[data-bs-toggle="tab"], .${N}[data-bs-toggle="pill"], .${N}[data-bs-toggle="list"]`;class R extends u{constructor(t){if(super(t),this._parent=this._element.closest(Sr),!this._parent)return;this._setInitialAttributes(this._parent,this._getChildren()),e.on(this._element,gr,e=>this._keydown(e))}static get NAME(){return cr}show(){const t=this._element;if(this._elemIsActive(t))return;const n=this._getActiveElem(),s=n?e.trigger(n,ur,{relatedTarget:t}):null,o=e.trigger(t,mr,{relatedTarget:n});if(o.defaultPrevented||s&&s.defaultPrevented)return;this._deactivate(n,t),this._activate(t,n)}_activate(t,n){if(!t)return;t.classList.add(N),this._activate(v(t));const s=()=>{if(t.getAttribute("role")!=="tab"){t.classList.add(We);return}t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),e.trigger(t,fr,{relatedTarget:n})};this._queueCallback(s,t,t.classList.contains(Mn))}_deactivate(t,n){if(!t)return;t.classList.remove(N),t.blur(),this._deactivate(v(t));const s=()=>{if(t.getAttribute("role")!=="tab"){t.classList.remove(We);return}t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),e.trigger(t,hr,{relatedTarget:n})};this._queueCallback(s,t,t.classList.contains(Mn))}_keydown(e){if(![br,bn,yr,yn].includes(e.key))return;e.stopPropagation(),e.preventDefault();const n=[bn,yn].includes(e.key),t=Le(this._getChildren().filter(e=>!w(e)),e.target,n,!0);t&&(t.focus({preventScroll:!0}),R.getOrCreateInstance(t).show())}_getChildren(){return t.find(De,this._parent)}_getActiveElem(){return this._getChildren().find(e=>this._elemIsActive(e))||null}_setInitialAttributes(e,t){this._setAttributeIfNotExists(e,"role","tablist");for(const e of t)this._setInitialAttributesOnChild(e)}_setInitialAttributesOnChild(e){e=this._getInnerElement(e);const t=this._elemIsActive(e),n=this._getOuterElement(e);e.setAttribute("aria-selected",t),n!==e&&this._setAttributeIfNotExists(n,"role","presentation"),t||e.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(e,"role","tab"),this._setInitialAttributesOnTargetPanel(e)}_setInitialAttributesOnTargetPanel(e){const t=v(e);if(!t)return;this._setAttributeIfNotExists(t,"role","tabpanel"),e.id&&this._setAttributeIfNotExists(t,"aria-labelledby",`#${e.id}`)}_toggleDropDown(e,n){const s=this._getOuterElement(e);if(!s.classList.contains(Cr))return;const o=(e,o)=>{const i=t.findOne(e,s);i&&i.classList.toggle(o,n)};o(Er,N),o(kr,We),s.setAttribute("aria-expanded",n)}_setAttributeIfNotExists(e,t,n){e.hasAttribute(t)||e.setAttribute(t,n)}_elemIsActive(e){return e.classList.contains(N)}_getInnerElement(e){return e.matches(De)?e:t.findOne(De,e)}_getOuterElement(e){return e.closest(Mr)||e}static jQueryInterface(e){return this.each(function(){const t=R.getOrCreateInstance(this);if(typeof e!="string")return;if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()})}}e.on(document,pr,Kn,function(e){if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),w(this))return;R.getOrCreateInstance(this).show()}),e.on(window,vr,()=>{for(const e of t.find(Dr))R.getOrCreateInstance(e)}),c(R);const Lr="toast",Rr="bs.toast",C=`.${Rr}`,Hr=`mouseover${C}`,Ir=`mouseout${C}`,Br=`focusin${C}`,Vr=`focusout${C}`,$r=`hide${C}`,Wr=`hidden${C}`,Ur=`show${C}`,Kr=`shown${C}`,qr="fade",ts="hide",ge="show",we="showing",Qr={animation:"boolean",autohide:"boolean",delay:"number"},Zr={animation:!0,autohide:!0,delay:5e3};class Ce extends u{constructor(e,t){super(e,t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Zr}static get DefaultType(){return Qr}static get NAME(){return Lr}show(){const t=e.trigger(this._element,Ur);if(t.defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(qr);const n=()=>{this._element.classList.remove(we),e.trigger(this._element,Kr),this._maybeScheduleHide()};this._element.classList.remove(ts),ne(this._element),this._element.classList.add(ge,we),this._queueCallback(n,this._element,this._config.animation)}hide(){if(!this.isShown())return;const t=e.trigger(this._element,$r);if(t.defaultPrevented)return;const n=()=>{this._element.classList.add(ts),this._element.classList.remove(we,ge),e.trigger(this._element,Wr)};this._element.classList.add(we),this._queueCallback(n,this._element,this._config.animation)}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(ge),super.dispose()}isShown(){return this._element.classList.contains(ge)}_maybeScheduleHide(){if(!this._config.autohide)return;if(this._hasMouseInteraction||this._hasKeyboardInteraction)return;this._timeout=setTimeout(()=>{this.hide()},this._config.delay)}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":{this._hasMouseInteraction=t;break}case"focusin":case"focusout":{this._hasKeyboardInteraction=t;break}}if(t){this._clearTimeout();return}const n=e.relatedTarget;if(this._element===n||this._element.contains(n))return;this._maybeScheduleHide()}_setListeners(){e.on(this._element,Hr,e=>this._onInteraction(e,!0)),e.on(this._element,Ir,e=>this._onInteraction(e,!1)),e.on(this._element,Br,e=>this._onInteraction(e,!0)),e.on(this._element,Vr,e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){const t=Ce.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e](this)}})}}Se(Ce),c(Ce);const ec={Alert:de,Button:fe,Carousel:ie,Collapse:le,Dropdown:h,Modal:B,Offcanvas:A,Popover:ct,ScrollSpy:Ee,Tab:R,Toast:Ce,Tooltip:U};return ec}),function(e){"use strict";e(function(){e('[data-bs-toggle="tooltip"]').tooltip(),e('[data-bs-toggle="popover"]').popover(),e(".popover-dismiss").popover({trigger:"focus"})});function t(e){return e.offset().top+e.outerHeight()}e(function(){var n,o,i,s=e(".js-td-cover");if(!s.length)return;o=t(s),i=e(".js-navbar-scroll").offset().top,n=Math.ceil(e(".js-navbar-scroll").outerHeight()),o-i{o(e(n.target)),t.blur()}),t.closest("form").on("submit",()=>!1);let n=null;const s=new Map;e.ajax(t.data("offline-search-index-json-src")).then(e=>{n=lunr(function(){this.ref("ref"),this.field("title",{boost:5}),this.field("categories",{boost:3}),this.field("tags",{boost:3}),this.field("description",{boost:2}),this.field("body"),e.forEach(e=>{this.add(e),s.set(e.ref,{title:e.title,excerpt:e.excerpt})})}),t.trigger("change")});const o=o=>{{let e=bootstrap.Popover.getInstance(o[0]);e!==null&&e.dispose()}if(n===null)return;const i=o.val();if(i==="")return;const c=n.query(e=>{const t=lunr.tokenizer(i.toLowerCase());t.forEach(t=>{const n=t.toString();e.term(n,{boost:100}),e.term(n,{wildcard:lunr.Query.wildcard.LEADING|lunr.Query.wildcard.TRAILING,boost:10}),e.term(n,{editDistance:2})})}).slice(0,o.data("offline-search-max-results")),a=e("
");a.append(e("
").css({display:"flex",justifyContent:"space-between",marginBottom:"1em"}).append(e("").text("Search results").css({fontWeight:"bold"})).append(e("").addClass("td-offline-search-results__close-button")));const r=e("
").css({maxHeight:`calc(100vh - ${o.offset().top-e(window).scrollTop()+180}px)`,overflowY:"auto"});a.append(r),c.length===0?r.append(e("

").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("

").addClass("mt-4");o.append(e("").addClass("d-block text-muted").text(n.ref)),o.append(e("").addClass("d-block").css({fontSize:"1.2rem"}).attr("href",a).text(i.title)),o.append(e("

").text(i.excerpt)),r.append(o)}),o.one("shown.bs.popover",()=>{e(".td-offline-search-results__close-button").on("click",()=>{o.val(""),o.trigger("change")})});const l=new bootstrap.Popover(o,{content:a[0],html:!0,customClass:"td-offline-search-results",placement:"bottom"});l.show()}})}(jQuery) \ No newline at end of file diff --git a/js/prism.js b/js/prism.js new file mode 100644 index 000000000..15f0f7825 --- /dev/null +++ b/js/prism.js @@ -0,0 +1,21 @@ +/* PrismJS 1.28.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+c+csharp+cpp+go+java+markdown+python+scss+sql+toml+yaml&plugins=toolbar+copy-to-clipboard */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; +!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},a={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:a},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:a},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:a.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:a.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var s=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=a.variable[1].inside,i=0;i>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean; +!function(e){function n(e,n){return e.replace(/<<(\d+)>>/g,(function(e,s){return"(?:"+n[+s]+")"}))}function s(e,s,a){return RegExp(n(e,s),a||"")}function a(e,n){for(var s=0;s>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var t="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(t+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(t+" "+r+" "+o),g=a("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=a("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=n("<<0>>(?:\\s*<<1>>)?",[h,g]),m=n("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=n("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=n("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k]),v=n("\\(<<0>>+(?:,<<0>>+)+\\)",[w]),x=n("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[v,m,k]),$={keyword:p,punctuation:/[<>()?,.:[\]]/},_="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",B='"(?:\\\\.|[^\\\\"\r\n])*"';e.languages.csharp=e.languages.extend("clike",{string:[{pattern:s("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:s("(^|[^@$\\\\])<<0>>",[B]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:s("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,x]),lookbehind:!0,inside:$},{pattern:s("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:s("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:$},{pattern:s("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:$},{pattern:s("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:s("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:$},{pattern:s("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[x,u,h]),inside:$}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:s("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:s("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:s("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:$},"return-type":{pattern:s("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[x,m]),inside:$,alias:"class-name"},"constructor-invocation":{pattern:s("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[x]),lookbehind:!0,inside:$,alias:"class-name"},"generic-method":{pattern:s("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:s("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:$}}},"type-list":{pattern:s("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,x,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:s("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:p,"class-name":{pattern:RegExp(x),greedy:!0,inside:$},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var E=B+"|"+_,R=n("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[E]),z=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),S="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",j=n("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,z]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:s("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[S,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:s("^<<0>>(?=\\s*:)",[S]),alias:"keyword"},"attribute-arguments":{pattern:s("\\(<<0>>*\\)",[z]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var A=":[^}\r\n]+",F=a(n("[^\"'/()]|<<0>>|\\(<>*\\)",[R]),2),P=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,A]),U=a(n("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[E]),2),Z=n("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[U,A]);function q(n,a){return{interpolation:{pattern:s("((?:^|[^{])(?:\\{\\{)*)<<0>>",[n]),lookbehind:!0,inside:{"format-string":{pattern:s("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[a,A]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:s('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[P]),lookbehind:!0,greedy:!0,inside:q(P,F)},{pattern:s('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[Z]),lookbehind:!0,greedy:!0,inside:q(Z,U)}],char:{pattern:RegExp(_),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism); +!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); +Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"]; +!function(e){var n=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,t="(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",s={pattern:RegExp("(^|[^\\w.])"+t+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[s,{pattern:RegExp("(^|[^\\w.])"+t+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()]|\\s*(?:\\[[\\s,]*\\]\\s*)?::\\s*new\\b)"),lookbehind:!0,inside:s.inside},{pattern:RegExp("(\\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\\s+)"+t+"[A-Z]\\w*\\b"),lookbehind:!0,inside:s.inside}],keyword:n,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":s,keyword:n,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp("(\\bimport\\s+)"+t+"(?:[A-Z]\\w*|\\*)(?=\\s*;)"),lookbehind:!0,inside:{namespace:s.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp("(\\bimport\\s+static\\s+)"+t+"(?:\\w+|\\*)(?=\\s*;)"),lookbehind:!0,alias:"static",inside:{namespace:s.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,(function(){return n.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); +!function(n){function e(n){return n=n.replace(//g,(function(){return"(?:\\\\.|[^\\\\\n\r]|(?:\n|\r\n?)(?![\r\n]))"})),RegExp("((?:^|[^\\\\])(?:\\\\{2})*)(?:"+n+")")}var t="(?:\\\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\\\|\r\n`])+",a="\\|?__(?:\\|__)+\\|?(?:(?:\n|\r\n?)|(?![^]))".replace(/__/g,(function(){return t})),i="\\|?[ \t]*:?-{3,}:?[ \t]*(?:\\|[ \t]*:?-{3,}:?[ \t]*)+\\|?(?:\n|\r\n?)";n.languages.markdown=n.languages.extend("markup",{}),n.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:n.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+i+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+i+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(t),inside:n.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+i+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(t),alias:"important",inside:n.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:e("\\b__(?:(?!_)|_(?:(?!_))+_)+__\\b|\\*\\*(?:(?!\\*)|\\*(?:(?!\\*))+\\*)+\\*\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:e("\\b_(?:(?!_)|__(?:(?!_))+__)+_\\b|\\*(?:(?!\\*)|\\*\\*(?:(?!\\*))+\\*\\*)+\\*"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:e("(~~?)(?:(?!~))+\\2"),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:e('!?\\[(?:(?!\\]))+\\](?:\\([^\\s)]+(?:[\t ]+"(?:\\\\.|[^"\\\\])*")?\\)|[ \t]?\\[(?:(?!\\]))+\\])'),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(e){["url","bold","italic","strike","code-snippet"].forEach((function(t){e!==t&&(n.languages.markdown[e].inside.content.inside[t]=n.languages.markdown[t])}))})),n.hooks.add("after-tokenize",(function(n){"markdown"!==n.language&&"md"!==n.language||function n(e){if(e&&"string"!=typeof e)for(var t=0,a=e.length;t",quot:'"'},l=String.fromCodePoint||String.fromCharCode;n.languages.md=n.languages.markdown}(Prism); +Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; +Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),Prism.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.languages.scss; +Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; +!function(e){function n(e){return e.replace(/__/g,(function(){return"(?:[\\w-]+|'[^'\n\r]*'|\"(?:\\\\.|[^\\\\\"\r\n])*\")"}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n("(^[\t ]*\\[\\s*(?:\\[\\s*)?)__(?:\\s*\\.\\s*__)*(?=\\s*\\])"),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n("(^[\t ]*|[{,]\\s*)__(?:\\s*\\.\\s*__)*(?=\\s*=)"),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism); +!function(e){var n=/[*&][^\s[\]{},]+/,r=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+r.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+r.source+")?)",a="(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*".replace(//g,(function(){return"[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]"})),d="\"(?:[^\"\\\\\r\n]|\\\\.)*\"|'(?:[^'\\\\\r\n]|\\\\.)*'";function o(e,n){n=(n||"").replace(/m/g,"")+"m";var r="([:\\-,[{]\\s*(?:\\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\\]|\\}|(?:[\r\n]\\s*)?#))".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return e}));return RegExp(r,n)}e.languages.yaml={scalar:{pattern:RegExp("([\\-:]\\s*(?:\\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\\S[^\r\n]*(?:\\2[^\r\n]+)*)".replace(/<>/g,(function(){return t}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp("((?:^|[:\\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\\s*:\\s)".replace(/<>/g,(function(){return t})).replace(/<>/g,(function(){return"(?:"+a+"|"+d+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:o("\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?"),lookbehind:!0,alias:"number"},boolean:{pattern:o("false|true","i"),lookbehind:!0,alias:"important"},null:{pattern:o("null|~","i"),lookbehind:!0,alias:"important"},string:{pattern:o(d),lookbehind:!0,greedy:!0},number:{pattern:o("[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)","i"),lookbehind:!0},tag:r,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism); +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var e=[],t={},n=function(){};Prism.plugins.toolbar={};var a=Prism.plugins.toolbar.registerButton=function(n,a){var r;r="function"==typeof a?a:function(e){var t;return"function"==typeof a.onClick?((t=document.createElement("button")).type="button",t.addEventListener("click",(function(){a.onClick.call(this,e)}))):"string"==typeof a.url?(t=document.createElement("a")).href=a.url:t=document.createElement("span"),a.className&&t.classList.add(a.className),t.textContent=a.text,t},n in t?console.warn('There is a button with the key "'+n+'" registered already.'):e.push(t[n]=r)},r=Prism.plugins.toolbar.hook=function(a){var r=a.element.parentNode;if(r&&/pre/i.test(r.nodeName)&&!r.parentNode.classList.contains("code-toolbar")){var o=document.createElement("div");o.classList.add("code-toolbar"),r.parentNode.insertBefore(o,r),o.appendChild(r);var i=document.createElement("div");i.classList.add("toolbar");var l=e,d=function(e){for(;e;){var t=e.getAttribute("data-toolbar-order");if(null!=t)return(t=t.trim()).length?t.split(/\s*,\s*/g):[];e=e.parentElement}}(a.element);d&&(l=d.map((function(e){return t[e]||n}))),l.forEach((function(e){var t=e(a);if(t){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(t),i.appendChild(n)}})),o.appendChild(i)}};a("label",(function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-label")){var n,a,r=t.getAttribute("data-label");try{a=document.querySelector("template#"+r)}catch(e){}return a?n=a.content:(t.hasAttribute("data-url")?(n=document.createElement("a")).href=t.getAttribute("data-url"):n=document.createElement("span"),n.textContent=r),n}})),Prism.hooks.add("complete",r)}}(); +!function(){function t(t){var e=document.createElement("textarea");e.value=t.getText(),e.style.top="0",e.style.left="0",e.style.position="fixed",document.body.appendChild(e),e.focus(),e.select();try{var o=document.execCommand("copy");setTimeout((function(){o?t.success():t.error()}),1)}catch(e){setTimeout((function(){t.error(e)}),1)}document.body.removeChild(e)}"undefined"!=typeof Prism&&"undefined"!=typeof document&&(Prism.plugins.toolbar?Prism.plugins.toolbar.registerButton("copy-to-clipboard",(function(e){var o=e.element,n=function(t){var e={copy:"Copy","copy-error":"Press Ctrl+C to copy","copy-success":"Copied!","copy-timeout":5e3};for(var o in e){for(var n="data-prismjs-"+o,c=t;c&&!c.hasAttribute(n);)c=c.parentElement;c&&(e[o]=c.getAttribute(n))}return e}(o),c=document.createElement("button");c.className="copy-to-clipboard-button",c.setAttribute("type","button");var r=document.createElement("span");return c.appendChild(r),u("copy"),function(e,o){e.addEventListener("click",(function(){!function(e){navigator.clipboard?navigator.clipboard.writeText(e.getText()).then(e.success,(function(){t(e)})):t(e)}(o)}))}(c,{getText:function(){return o.textContent},success:function(){u("copy-success"),i()},error:function(){u("copy-error"),setTimeout((function(){!function(t){window.getSelection().selectAllChildren(t)}(o)}),1),i()}}),c;function i(){setTimeout((function(){u("copy")}),n["copy-timeout"])}function u(t){r.textContent=n[t],c.setAttribute("data-copy-state",t)}})):console.warn("Copy to Clipboard plugin loaded before Toolbar plugin."))}(); diff --git a/js/tabpane-persist.js b/js/tabpane-persist.js new file mode 100644 index 000000000..236213075 --- /dev/null +++ b/js/tabpane-persist.js @@ -0,0 +1,116 @@ +// Storage key names and data attribute name: +const td_persistStorageKeyNameBase = 'td-tp-persist'; +const td_persistCounterStorageKeyName = `${td_persistStorageKeyNameBase}-count`; +const td_persistDataAttrName = `data-${td_persistStorageKeyNameBase}`; + +// Utilities + +const _tdPersistCssSelector = (attrValue) => + attrValue + ? `[${td_persistDataAttrName}="${attrValue}"]` + : `[${td_persistDataAttrName}]`; + +const _tdStoragePersistKey = (tabKey) => + td_persistStorageKeyNameBase + ':' + (tabKey || ''); + +const _tdSupportsLocalStorage = () => typeof Storage !== 'undefined'; + +// Helpers + +function tdPersistKey(key, value) { + // @requires: tdSupportsLocalStorage(); + + try { + if (value) { + localStorage.setItem(key, value); + } else { + localStorage.removeItem(key); + } + } catch (error) { + const action = value ? 'add' : 'remove'; + console.error( + `Docsy tabpane: unable to ${action} localStorage key '${key}': `, + error + ); + } +} + +// Retrieve, increment, and store tab-select event count, then returns it. +function tdGetTabSelectEventCountAndInc() { + // @requires: tdSupportsLocalStorage(); + + const storedCount = localStorage.getItem(td_persistCounterStorageKeyName); + let numTabSelectEvents = parseInt(storedCount) || 0; + numTabSelectEvents++; + tdPersistKey(td_persistCounterStorageKeyName, numTabSelectEvents.toString()); + return numTabSelectEvents; +} + +// Main functions + +function tdActivateTabsWithKey(key) { + if (!key) return; + + document.querySelectorAll(_tdPersistCssSelector(key)).forEach((element) => { + new bootstrap.Tab(element).show(); + }); +} + +function tdPersistActiveTab(activeTabKey) { + if (!_tdSupportsLocalStorage()) return; + + tdPersistKey( + _tdStoragePersistKey(activeTabKey), + tdGetTabSelectEventCountAndInc() + ); + tdActivateTabsWithKey(activeTabKey); +} + +// Handlers + +function tdGetAndActivatePersistedTabs(tabs) { + // Get unique persistence keys of tabs in this page + var keyOfTabsInThisPage = [ + ...new Set( + Array.from(tabs).map((el) => el.getAttribute(td_persistDataAttrName)) + ), + ]; + + // Create a list of active tabs with their age: + let key_ageList = keyOfTabsInThisPage + // Map to [tab-key, last-activated-age] + .map((k) => [ + k, + parseInt(localStorage.getItem(_tdStoragePersistKey(k))) || 0, + ]) + // Exclude tabs that have never been activated + .filter(([k, v]) => v) + // Sort from oldest selected to most recently selected + .sort((a, b) => a[1] - b[1]); + + // Activate tabs from the oldest to the newest + key_ageList.forEach(([key]) => { + tdActivateTabsWithKey(key); + }); + + return key_ageList; +} + +function tdRegisterTabClickHandler(tabs) { + tabs.forEach((tab) => { + tab.addEventListener('click', () => { + const activeTabKey = tab.getAttribute(td_persistDataAttrName); + tdPersistActiveTab(activeTabKey); + }); + }); +} + +// Register listeners and activate tabs + +window.addEventListener('DOMContentLoaded', () => { + if (!_tdSupportsLocalStorage()) return; + + var allTabsInThisPage = document.querySelectorAll(_tdPersistCssSelector()); + tdRegisterTabClickHandler(allTabsInThisPage); + tdGetAndActivatePersistedTabs(allTabsInThisPage); +}); diff --git a/offline-search-index.b523bf9e7f96840ce1ed213aba3b3d4a.json b/offline-search-index.b523bf9e7f96840ce1ed213aba3b3d4a.json new file mode 100644 index 000000000..bd1160446 --- /dev/null +++ b/offline-search-index.b523bf9e7f96840ce1ed213aba3b3d4a.json @@ -0,0 +1 @@ +[{"body":"The Drycc Workflow command-line interface (CLI), or client, allows you to interact with Drycc Workflow.\nInstallation Install the latest drycc client for Linux or Mac OS X with: $ curl -sfL https://www.drycc.cc/install-cli.sh | bash -\nThe installer puts drycc in your current directory, but you should move it somewhere in your $PATH:\n$ ln -fs $PWD/drycc /usr/local/bin/drycc Getting Help The Drycc client comes with comprehensive documentation for every command. Use drycc help to explore the commands available to you:\n$ drycc help The Drycc command-line client issues API calls to a Drycc controller. Usage: drycc \u003ccommand\u003e [\u003cargs\u003e...] 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]:\n$ 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 Support for Multiple Profiles The CLI reads from the default client profile, which is located on your workstation at $HOME/.drycc/client.json.\nEasily switch between multiple Drycc Workflow installations or users by setting the $DRYCC_PROFILE environment variable or by using the -c flag.\nThere are two ways to set the $DRYCC_PROFILE option.\nPath to a json configuration file. Profile name. If you set profile to just a name, it will be saved alongside the default profile, in $HOME/.drycc/\u003cname\u003e.json. Examples:\n$ 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:\n$ drycc whoami -c ~/config.json You are drycc at drycc.example.com Proxy Support 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:\n$ export http_proxy=\"http://proxyip:port\" $ export https_proxy=\"http://proxyip:port\" !!! note Configuring a proxy is generally not necessary for local Minikube clusters.\nCLI Plugins Plugins allow developers to extend the functionality of the Drycc Client, adding new commands or features.\nIf 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:\n$ # 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:\n$ # these two are identical $ drycc accounts:list --debug $ drycc-accounts list --debug But flags preceding the command will not:\n$ # these two are identical $ drycc --debug accounts:list $ drycc-accounts list ","categories":"","description":"How to download, install, and start using the Drycc CLI. The Drycc CLI used to be part of the Drycc Toolbelt.","excerpt":"How to download, install, and start using the Drycc CLI. The Drycc CLI …","ref":"/docs/users/cli/","tags":"","title":"Drycc Workflow CLI"},{"body":"Twelve-Factor Applications The Twelve-Factor App is a methodology for building modern applications that can be scaled across a distributed system.\nTwelve-factor is a valuable synthesis of years of experience with software-as-a-service apps in the wild, particularly on the Heroku platform.\nWorkflow is designed to run applications that adhere to the Twelve-Factor App methodology and best practices.\nKubernetes 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.\nWorkflow 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.\nDrycc 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.\nSee the components overview for more detail.\nContainer [Container][] is an open source project to build, ship and run any application as a lightweight, portable, self-sufficient container.\nIf 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.\nApplications which use either a Dockerfile or reference external Container images are launched unmodified.\nApplications Workflow is designed around the concept of an application, or app.\nApplications come in one of three forms:\na collection of source files stored in a git repository a Dockerfile and associated source files stored in a git repository a reference to an existing image at a Container repository Applications 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.\nBuild, Release, Run Build Stage The builder component processes incoming git push drycc master requests and manages your application packaging.\nIf 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.\nIf 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.\nIf 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.\nRelease Stage 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.\nRun Stage 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.\nBacking Services 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.\nApplications 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.\nSee Also Workflow Architecture Workflow Components ","categories":"","description":"Drycc Workflow is a lightweight application platform that deploys and scales Twelve-Factor apps as containers across a Kubernetes cluster.","excerpt":"Drycc Workflow is a lightweight application platform that deploys and …","ref":"/docs/understanding-workflow/concepts/","tags":"","title":"Concepts"},{"body":"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.\nPrerequisites 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.\n$ which openssl /usr/bin/openssl If the which command does not return a path then you will need to install openssl yourself:\nIf you have… Install with… Mac OS X Homebrew: brew install openssl Windows complete package .exe installed Ubuntu Linux apt-get install openssl Generate Private Key and Certificate Signing Request 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.\n$ 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 []: ... Generate SSL Certificate The self-signed SSL certificate is generated from the server.key private key and server.csr files.\n$ 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.\n","categories":"","description":"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.","excerpt":"A self-signed TLS/SSL certificate is not signed by a publicly trusted …","ref":"/docs/reference-guide/creating-a-self-signed-ssl-certificate/","tags":"","title":"Creating a Self-Signed SSL Certificate"},{"body":"An Application is deployed to Drycc using git push or the drycc client.\nSupported Applications 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.\nFor 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.\nFortunately, most modern applications feature a stateless application tier that can scale horizontally inside Drycc.\nLogin to the Controller !!! important if you haven’t yet, now is a good time to install the client and register.\nBefore deploying an application, users must first authenticate against the Drycc Controller using the URL supplied by their Drycc administrator.\n$ 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\n$ drycc login http://drycc.example.com --username=demo --password=demo Configuration file written to /root/.drycc/client.json Select a Build Process Drycc Workflow supports three different ways of building applications:\nBuildpacks Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.\nLearn how to deploy applications using Buildpacks.\nDockerfiles Dockerfiles are a powerful way to define a portable execution environment built on a base OS of your choosing.\nLearn how to deploy applications using Dockerfiles.\nContainer Image 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.\nLearn how to deploy applications using Container images.\nTuning Application Settings It is possible to configure a few of the globally tunable settings on per application basis using config:set.\nSetting 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 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.\nDeployments Deployments behave a little bit differently from the RC based deployment strategy.\nKubernetes 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.\nThe base timeout is multiplied with DRYCC_DEPLOY_BATCHES to create an overall timeout. This would be 240 (timeout) * 4 (batches) = 960 second overall timeout.\nRC deploy This deploy timeout defines how long to wait for each batch to complete in DRYCC_DEPLOY_BATCHES.\nAdditions to the base timeout 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.\nDeployments Workflow uses Deployments for deploys. In prior versions ReplicationControllers were used with the ability to turn on Deployments via DRYCC_KUBERNETES_DEPLOYMENTS=1.\nThe 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.\nBehind 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.\nDrycc 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.\n","categories":"","description":"Learn how to deploy the application to drycc.","excerpt":"Learn how to deploy the application to drycc.","ref":"/docs/applications/deploying-apps/","tags":"","title":"Deploying an Application"},{"body":"Get started with Drycc Workflow in three easy steps.\nInstall CLI tools for Helm and Drycc Workflow Boot a Kubernetes and install Drycc Workflow Deploy your first application 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.\nStep 1: Install Workflow For the quickstart we will install Drycc Workflow.\nStep 2: Install CLI tools For the quickstart we will install Drycc Workflow CLI.\nStep 3: Deploy your first app Last but not least, login and deploy your first application.\n","categories":"","description":"This guide helps you set up the Drycc workflow.","excerpt":"This guide helps you set up the Drycc workflow.","ref":"/docs/quickstart/overview/","tags":"","title":"Quick Start"},{"body":"File Bugs \u0026 Enhancements 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.\nOur official support channel is the Drycc #community Slack channel.\nDon’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.\nAdditionally, take a look at the troubleshooting documentation for common issues.\nBefore 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.\nWrite Documentation 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.\nContribute Code 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.\nWhen you’re ready to begin writing code, review Design Documents and get your Development Environment set up.\nBy 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.\nTriage Issues 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.\nShare your Experience 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.\n","categories":"","description":"Interested in contributing to a Drycc project? There are lots of ways to help.","excerpt":"Interested in contributing to a Drycc project? There are lots of ways …","ref":"/docs/contribution-guidelines/overview/","tags":"","title":"Contributor Overview"},{"body":"The Role of Maintainers Maintainers lead the Drycc projects. Their duties include proposing the Roadmap, reviewing and integrating contributions and maintaining the vision of the project.\nOpen Roadmap The Drycc Roadmap is a community document. While Maintainers propose the Roadmap, it gets discussed and refined in Release Planning Meetings.\nContributing to the Roadmap 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.\nRelease Milestones 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.\nRelease Planning Meetings Major decisions affecting the Roadmap are discussed during Release Planning Meetings on the first Thursday of each month, aligned with the Release Schedule.\nRelease 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.\nCredits Thanks to Amy Lindburg and our friends at Podman for their inspiration.\n","categories":"","description":"Drycc features a lightweight process that emphasizes openness and ensures every community member can be an integral part of planning for the future.","excerpt":"Drycc features a lightweight process that emphasizes openness and …","ref":"/docs/roadmap/planning-process/","tags":"","title":"Planning Process"},{"body":"","categories":"","description":"Step-by-step guides for deploying your first app and mastering the basics of Drycc.\n","excerpt":"Step-by-step guides for deploying your first app and mastering the …","ref":"/docs/quickstart/","tags":"","title":"Quick Start"},{"body":"Kubernetes Versions Drycc Workflow requires Kubernetes v1.16.15 or later.\nComponents Requirements Drycc uses gateway as a routing implementation, so you have to choose an gateway. We recommend using istio or kong.\nWorkflow 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.\nWorkflow 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.\nWorkflow also supports the OSB API through the ‘drycc resources’ command. If you want to use this function, you need to install service-catalog.\nStorage Requirements 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.\nDrycc Workflow ships with drycc storage by default, which provides in-cluster.\nWorkflow supports Amazon Simple Storage Service (S3), Google Cloud Storage (GCS), OpenShift Swift, and Azure Blob Storage. See configuring object storage for setup instructions.\nResource Requirements 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.\nDrycc 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:\nAt least 4GB of RAM (more is better) At least 40GB of hard disk space Note that these estimates are for Drycc Workflow and Kubernetes only. Be sure to leave enough spare capacity for your application footprint as well.\nRunning smaller machines will likely result in increased system load and has been known to result in component failures and instability.\n","categories":"","description":"To run Drycc Workflow on a Kubernetes cluster, there are a few requirements to keep in mind.","excerpt":"To run Drycc Workflow on a Kubernetes cluster, there are a few …","ref":"/docs/installing-workflow/system-requirements/","tags":"","title":"Requirements"},{"body":"A Component Fails to Start For information on troubleshooting a failing component, see Troubleshooting with Kubectl.\nAn Application Fails to Start For information on troubleshooting application deployment issues, see Troubleshooting Applications.\nPermission denied (publickey) 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.\nIf 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.\nOther Issues Running into something not detailed here? Please open an issue or hop into #community on Slack for help!\n","categories":"","description":"Common issues that users have run into when provisioning Workflow are detailed below.","excerpt":"Common issues that users have run into when provisioning Workflow are …","ref":"/docs/troubleshooting/workflow/","tags":"","title":"Troubleshooting Workflow"},{"body":"After you add the Drycc Chart Repository, you can customize the chart using helm inspect values drycc/workflow \u003e values.yaml before using helm install to complete the installation.\nThere are a few ways to customize the respective component:\nIf 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:\n$ 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:\n$ 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.\nLastly, one may also fetch and edit the chart as served by version control/the chart repository itself:\n$ 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.\nSetting Resource limits 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.\nBelow is an example of how the builder section of values.yaml might look with CPU and memory limits set:\nbuilder: imageOrg: \"drycc\" imagePullPolicy: \"Always\" imageTag: \"canary\" limitsCpu: \"100m\" limitsMemory: \"50Mi\" Customizing the Builder The following environment variables are tunable for the Builder component:\nSetting 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 Customizing the Controller The following environment variables are tunable for the Controller component:\nSetting 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) LDAP authentication settings Configuration options for LDAP authentication are detailed here.\nThe following environment variables are available for enabling LDAP authentication of user accounts in the Passport component:\nSetting 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) Global and per application settings 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.\nCustomizing the Database The following environment variables are tunable for the Database component:\nSetting 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) Customizing Fluentbit The following values can be changed in the values.yaml file or by using the --values flag with the Helm CLI.\nKey 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.\nCustomizing the Logger The following environment variables are tunable for the Logger component:\nSetting 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) Customizing the Monitor Grafana 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:\nSetting 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.\nTelegraf For a list of configuration values that can be set by using environment variables please see the following configuration file.\nPrometheus You can find a list of values that can be set using environment variables here.\nCustomizing the Registry The Registry component can be tuned by following the drycc/distribution config doc.\nCustomizing the Router 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.\nThe following environment variables are tunable for the [Router][] component:\nSetting Description POD_NAMESPACE The pod namespace the router resides in. This is set by the Kubernetes downward API. Customizing Workflow Manager The following environment variables are tunable for [Workflow Manager][]:\nSetting 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”) ","categories":"","description":"Helm Charts are a set of Kubernetes manifests that reflect best practices for deploying an application or service on Kubernetes.","excerpt":"Helm Charts are a set of Kubernetes manifests that reflect best …","ref":"/docs/managing-workflow/tuning-component-settings/","tags":"","title":"Tuning Component Settings"},{"body":"All components are published as a set of container images which can be deployed to any compliant Kubernetes cluster.\nOverview 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.\nPlatform Services Drycc Workflow provides additional functionality to your Kubernetes cluster, including:\nSource to Image Builder which compiles your Application code via Buildpacks or Dockerfiles Cross-Pod Log Aggregation which gathers logs from all of your Application processes Simple REST API which powers the CLI and any external integrations Application release and rollback Authentication and Authorization to Application resources HTTP/HTTPS edge routing for your Applications Kubernetes-Native 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.\nApplication Layout and Edge Routing 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.\nThe router component is responsible for routing HTTP/s traffic to your Applications as well as proxying git push and platform API traffic.\nBy 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.\nThe 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.\nTopologies 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.\n","categories":"","description":"Drycc Workflow is built using a service oriented architecture.","excerpt":"Drycc Workflow is built using a service oriented architecture.","ref":"/docs/understanding-workflow/architecture/","tags":"","title":"Architecture"},{"body":"Drycc supports deploying applications via Cloud Native Buildpacks. Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.\nAdd SSH Key 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.\nSee this document for instructions on how to generate an SSH key.\nRun drycc keys:add to upload your SSH key to Drycc Workflow.\n$ drycc keys:add ~/.ssh/id_drycc.pub Uploading id_drycc.pub to drycc... done Read more about adding/removing SSH Keys here.\nPrepare an Application If you do not have an existing application, you can clone an example application that demonstrates the Heroku Buildpack workflow.\n$ git clone https://github.com/drycc/example-go.git $ cd example-go Create an Application Use drycc create to create an application on the Controller.\n$ drycc create Creating application... done, created skiing-keypunch Git remote drycc added Push to Deploy Use git push drycc master to deploy your application.\n$ 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: ---\u003e Starting build... but first, coffee! ---\u003e Waiting podman running. ---\u003e Process podman started. ---\u003e Waiting caddy running. ---\u003e Process caddy started. ---\u003e Building pack ---\u003e 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 ... ---\u003e Skip generate base layer ---\u003e Python Buildpack ---\u003e Downloading and extracting Python 3.10.0 ---\u003e 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\u003e=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\u003c4,\u003e=3.3.2 Downloading asgiref-3.4.1-py3-none-any.whl (25 kB) Requirement already satisfied: setuptools\u003e=3.0 in /layers/drycc_python/python/lib/python3.10/site-packages (from gunicorn==20.1.0-\u003e-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 ---\u003e 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 -\u003e 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.\nUse 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.\nIncluded Buildpacks For convenience, a number of buildpacks come bundled with Drycc:\nGo Buildpack Java Buildpack Nodejs Buildpack PHP Buildpack Python Buildpack Ruby Buildpack Rust Buildpack Drycc will cycle through the bin/detect script of each buildpack to match the code you are pushing.\n!!! note If you’re testing against the [Scala Buildpack][], the Builder requires at least 512MB of free memory to execute the Scala Build Tool.\nUsing a Custom Buildpack To use a custom buildpack, you need create a .pack_builder file in your root path app.\n$ tee \u003e .pack_builder \u003c\u003c EOF \u003e registry.drycc.cc/drycc/buildpacks:bookworm \u003e EOF On your next git push, the custom buildpack will be used.\nUsing Private Repositories 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:\n$ 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:\n$ tee \u003e .pack_builder \u003c\u003c EOF \u003e registry.drycc.cc/drycc/buildpacks:bookworm \u003e EOF $ git add .buildpack $ git commit -m \"chore(buildpack): modify the pack_builder\" $ git push drycc master Builder selector Which way to build a project conforms to the following principles:\nIf Dockerfile exists in the project, the stack uses container If Procfile exists in the project, the stack uses buildpack If both exist, container is used by default You can also set the DRYCC_STACK to container or buildpack determine which stack to use. ","categories":"","description":"An overview of buildpacks, which are responsible for transforming deployed code into a slug, which can then be executed on a container.","excerpt":"An overview of buildpacks, which are responsible for transforming …","ref":"/docs/applications/using-buildpacks/","tags":"","title":"Using Buildpacks"},{"body":"For example, assuming example.com were a cluster’s domain:\nThe controller should be accessible at drycc.example.com Applications should be accessible (by default) at \u003capplication name\u003e.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.\nWith a Load Balancer 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.\nFor example, assuming a domain of example.com:\nAn A record enumerating each of your load balancer(s) IPs (i.e. DNS round-robining) A CNAME record referencing an existing fully-qualified domain name for the load balancer Per AWS’ own documentation, this is the recommended strategy when using AWS Elastic Load Balancers, as ELB IPs may change over time. 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.\nAlthough 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:\n$ kubectl --namespace=istio-nginx describe service | grep \"LoadBalancer\" LoadBalancer Ingress:\ta493e4e58ea0511e5bb390686bc85da3-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.\nWithout a Load Balancer 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.\nBecause 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.\nIn 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.\nTo begin, find the node(s) hosting router instances using kubectl:\n$ 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.\nYou can list the IP addresses of a node using kubectl:\n$ kubectl describe node ip-10-0-0-199.us-west-2.compute.internal # ... Addresses:\t10.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.\nTutorial: Configuring DNS with Google Cloud DNS In this section, we’ll describe how to configure Google Cloud DNS for routing your domain name to your Drycc cluster.\nWe’ll assume the following in this section:\nYour Ingress service has a load balancer in front of it. The load balancer need not be cloud based, it just needs to provide a stable IP address or a stable domain name You have the mystuff.com domain name registered with a registrar Replace your domain name with mystuff.com in the instructions to follow Your registrar lets you alter the nameservers for your domain name (most registrars do) Here are the steps for configuring cloud DNS to route to your drycc cluster:\nGet the load balancer IP or domain name If you are on Google Container Engine, you can run kubectl get svc -n istio-ingress and look for the LoadBalancer Ingress column to get the IP address Create a new Cloud DNS Zone (on the console: Networking =\u003e Cloud DNS, then click on Create Zone) Name your zone, and set the DNS name to mystuff.com. (note the . at the end Click on the Create button Click on the Add Record Set button on the resulting page If your load balancer provides a stable IP address, enter the following fields in the resulting form: DNS 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 TTL IPv4 Address: The IP that you got in the very first step Click the Create button If your load balancer provides the stable domain name lbdomain.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 TTL Canonical name: lbdomain.com. (note the . a the end) Click on the Create button In your domain registrar, set the nameservers for your mystuff.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.\nTesting 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!):\ncurl http://drycc.example.com/v2/ Or:\ncurl 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:\n{\"detail\":\"Authentication credentials were not provided.\"} ","categories":"","description":"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.","excerpt":"The Drycc Workflow controller and all applications deployed via …","ref":"/docs/managing-workflow/configuring-dns/","tags":"","title":"Configure DNS"},{"body":"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.\nGoals Design documents help ensure project contributors:\nInvolve stakeholders as early as possible in a feature’s development Ensure code changes accomplish the original motivations and design goals Establish clear acceptance criteria for a feature or change Enforce test-driven design methodology and automated test coverage Contents Design document issues should be named Design Doc: \u003cchange description\u003e and contain the following sections:\nGoal 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.\nThis section should also reference a separate GitHub issue tracking the feature or change, which will typically be assigned to a release milestone.\nCode Changes 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.\nTests 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.\nIf 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.\nThe 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.\nApproval 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.\nOnce 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.\nSee Submitting a Pull Request for more information on pull request and commit message formatting.\n","categories":"","description":"Before submitting a pull request which will significantly alter the behavior of any Drycc component.","excerpt":"Before submitting a pull request which will significantly alter the …","ref":"/docs/contribution-guidelines/design-documents/","tags":"","title":"Design Documents"},{"body":"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.\nOperating Systems Drycc is expected to work on most modern Linux systems. Some OSS have specific requirements:\n(Red Hat/CentOS) Enterprise Linux, they usually use RPM package management. Ubuntu (Desktop/Server/Cloud) Linux, a very popular distribution. Debian GNU Linux, a very pure distribution of opensource software. If you want to add more Linux distribution support, please submit a issue on github or submit PR directly.\nSystem Software Some basic software needs to be installed before installing drycc workflow.\nOS configuration 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.\nInstalling NFSv4 client The command used to install a NFSv4 client differs depending on the Linux distribution.\nFor Debian and Ubuntu, use this command:\n$ apt-get install nfs-common For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:\n$ yum install nfs-utils Installing curl For Debian and Ubuntu, use this command:\n$ apt-get install curl For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:\n$ yum install curl Hardware Hardware requirements scale based on the size of your deployments. Minimum recommendations are outlined here.\nRAM: 1G Minimum (we recommend at least 2GB) CPU: 1 Minimum This configuration only contains the minimum requirements that can meet the operation.\nDisk 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.\nDomain Name 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.\n$ 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\n$ export PLATFORM_DOMAIN=59.46.3.190.nip.io Install 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.\n$ 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.\n$ curl -sfL https://www.drycc.cc/install.sh | bash - !!! important If you are in China, you need to use mirror acceleration:\n``` $ curl -sfL https://www.drycc.cc/install.sh | INSTALL_DRYCC_MIRROR=cn bash - ``` Install Node 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.\nFirst, check the cluster token of the master. $ 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.\nThen, Set the environment variable: $ 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:\n``` $ export INSTALL_DRYCC_MIRROR=cn ``` Join the cluster as server: $ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_server Join the cluster as agent: $ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_agent Install Options When using this method to install drycc, the following environment variables can be used to configure the installation:\nENVIRONMENT 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.\nUninstall If you installed drycc using an installation script, you can uninstall the entire drycc using this script.\n$ curl -sfL https://www.drycc.cc/uninstall.sh | bash - ","categories":"","description":"Install Workflow in pure host, it can be a cloud server, bare metal server, virtual machine, or even your laptop.","excerpt":"Install Workflow in pure host, it can be a cloud server, bare metal …","ref":"/docs/quickstart/install-workflow/","tags":"","title":"Install Workflow"},{"body":"Install Drycc Workflow (Specify gateway) Now that Helm is installed and the repository has been added, install Workflow with a native gateway by running:\n$ 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:\n$ 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\nWhere 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.\nHelm 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:\n$ 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:\n$ 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.\nHere, it can be seen that the controller, builder and registry all took a few loops waiting for storage before they were able to start:\n$ 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 Install a Kubernetes Gateway Now that Workflow has been deployed with the global.gatewayClass , we will need a Kubernetes gateway in place to begin routing traffic.\nHere is an example of how to use istio as an gateway for Workflow. Of course, you are welcome to use any controller you wish.\n$ 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 Configure DNS User must install drycc and then set up a hostname, and assumes the *.$host convention.\nWe 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.\n$ 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.\nName 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!\nAfter installing Workflow, register a user and deploy an application.\nIf 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.\n","categories":"","description":"Choose the gateway provider that best suits your needs and platform.","excerpt":"Choose the gateway provider that best suits your needs and platform.","ref":"/docs/installing-workflow/gateway/","tags":"","title":"Specify Gateway"},{"body":"If help is required getting started with Kubernetes and Drycc Workflow, follow the quickstart guide for assistance.\nPrerequisites Verify the Kubernetes system requirements Install Helm and Drycc Workflow CLI tools Check Your Setup Check that the helm command is available and the version is v2.5.0 or newer.\n$ helm version Client: \u0026version.Version{SemVer:\"v2.5.0\", GitCommit:\"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6\", GitTreeState:\"clean\"} Server: \u0026version.Version{SemVer:\"v2.5.0\", GitCommit:\"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6\", GitTreeState:\"clean\"} Choose Your Deployment Strategy 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.\nMore rigorous installations would benefit from using outside sources for the following things:\nPostgres - For example AWS RDS. Registry - This includes quay.io, dockerhub, Amazon ECR, and Google GCR. Redis - Such as AWS Elasticache Grafana Gateway Now, workflow requires that gateway and cert-manager must be installed. Any compatible Kubernetes entry controller can be used.\nInstall Drycc Workflow If the version of helm is 3.0 +; you need to create the namespace in advance:\nkubectl create ns drycc If you want to change it, set the variable when using helm.\n$ 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:\n$ 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):\n$ 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.\nHere, it can be seen that the controller, builder and registry all took a few loops before they were able to start:\n$ 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!\nFor more installation parameters, please check the values.yaml file of workflow.\nAfter installing Workflow, register a user and deploy an application.\nConfigure DNS User must to set up a hostname, and assumes the drycc-builder.$host convention.\nWe 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.\n$ 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.\nName 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!\nAfter installing Workflow, register a user and deploy an application.\nIf 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.\n","categories":"","description":"This document is aimed at those who have already provisioned a Kubernetes cluster and want to install Drycc Workflow.","excerpt":"This document is aimed at those who have already provisioned a …","ref":"/docs/installing-workflow/workflow/","tags":"","title":"Installing Drycc Workflow"},{"body":"Drycc Workflow Roadmap 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.\nGiven the project’s rapid Release Schedule, roadmap items are designed to provide a sense of direction over many releases.\nInteractive drycc run /bin/bash Provide the ability for developers to launch an interactive terminal session in their application environment.\nRelated issues:\nhttps://github.com/drycc/workflow-cli/issues/28 https://github.com/drycc/drycc/issues/117 Log Streaming Stream application logs via drycc logs -f https://github.com/drycc/drycc/issues/465\nTeams and Permissions 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.\nRelated issues:\nDeploy Keys: https://github.com/drycc/drycc/issues/3875 Teams: https://github.com/drycc/drycc/issues/4173 Fine grained permissions: https://github.com/drycc/drycc/issues/4150 Admins create apps only: https://github.com/drycc/drycc/issues/4052 Admin Certificate Permissions: https://github.com/drycc/drycc/issues/4576#issuecomment-170987223 Monitoring Define and deliver alerts with Kapacitor: https://github.com/drycc/monitor/issues/44 Workflow Addons/Services Developers should be able to quickly and easily provision application dependencies using a services or addon abstraction. https://github.com/drycc/drycc/issues/231\nInbound/Outbound Webhooks Drycc Workflow should be able to send and receive webhooks from external systems. Facilitating integration with third party services like GitHub, Gitlab, Slack, Hipchat.\nSend webhook on platform events: https://github.com/drycc/drycc/issues/1486 (Workflow v2.10) ","categories":"","description":"Drycc roadmap is community driven and managed through GitHub.","excerpt":"Drycc roadmap is community driven and managed through GitHub.","ref":"/docs/roadmap/roadmap/","tags":"","title":"Drycc Workflow Roadmap"},{"body":"This document describes how one can use kubectl to debug any issues with the cluster.\nDiving into the Components 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:\n$ 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.\nTo fetch the logs of a specific component, use kubectl logs:\n$ 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:\n$ 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) ","categories":"","description":"Kubernetes provides a command line tool for communicating with a Kubernetes cluster's control plane, using the Kubernetes API.","excerpt":"Kubernetes provides a command line tool for communicating with a …","ref":"/docs/troubleshooting/kubectl/","tags":"","title":"Troubleshooting using Kubectl"},{"body":"","categories":"","description":"Understanding the architecture design of workflow.\n","excerpt":"Understanding the architecture design of workflow.\n","ref":"/docs/understanding-workflow/","tags":"","title":"Understanding Workflow"},{"body":"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.\nLogin to Workflow If you already have an account, use drycc login to authenticate against the Drycc Workflow API.\n$ 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\nLogout from Workflow Logout of an existing controller session using drycc logout.\n$ drycc logout Logged out as drycc Verify Your Session You can verify your client configuration by running drycc whoami.\n$ drycc whoami You are drycc at http://drycc.example.com !!! note Session and client configuration is stored in the ~/.drycc/client.json file.\n","categories":"","description":"Get started on Drycc today","excerpt":"Get started on Drycc today","ref":"/docs/users/registration/","tags":"","title":"Users and Registration"},{"body":"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.\nAll 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!\nController Project Location: drycc/controller\nThe 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.\nPassport Project Location: drycc/passport\nThe passport component exposes a web API and provide OAuth2 authentication.\nDatabase Project Location: drycc/postgres\nThe 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.\nBuilder Project Location: drycc/builder\nThe builder component is responsible for accepting code pushes via Git and managing the build process of your Application. The builder process is:\nReceives incoming git push requests over SSH Authenticates the user via SSH key fingerprint Authorizes the user’s access to push code to the Application Starts the Application Build phase (see below) Triggers a new Release via the Controller Builder currently supports both buildpack and Dockerfile based builds.\nProject Location: drycc/imagebuilder\nFor 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.\nUnlike 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.\nObject Storage Project Location: drycc/storage\nAll 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.\nWorkflow supports either on or off-cluster storage. For production deployments we highly recommend that you configure off-cluster object storage.\nTo facilitate experimentation, development and test environments, the default charts for Workflow include on-cluster storage via storage.\nIf you also feel comfortable using Kubernetes persistent volumes you may configure storage to use persistent storage available in your environment.\nRegistry Project Location: drycc/registry\nThe 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.\nLogger: fluentbit, logger The logging subsystem consists of two components. Fluentbit handles log shipping and logger maintains a ring-buffer of application logs.\nProject Location: drycc/fluentbit\nFluentbit 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.\nProject Location: drycc/logger\nThe 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.\nMonitor Project Location: drycc/monitor\nThe monitoring subsystem consists of two components: Telegraf and Grafana.\nTelegraf 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.\nGrafana 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.\nPrometheus Project Location: drycc/prometheus\nPrometheus 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.\nRabbitmq Project Location: drycc/rabbitmq\nRabbitMQ is the most widely deployed open source message broker. Controller use celery with rabbitMQ to execute the asynchronous task.\nHelmBroker Project Location: drycc/rabbitmq\nHelm 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.\nPrometheus Project Location: drycc/rabbitmq\nPrometheus is an open-source systemsmonitoring and alerting toolkit originally built atSoundCloud.\nSee Also Workflow Concepts Workflow Architecture ","categories":"","description":"Workflow is comprised of a number of small, independent services that combine to create a distributed CaaS.","excerpt":"Workflow is comprised of a number of small, independent services that …","ref":"/docs/understanding-workflow/components/","tags":"","title":"Components"},{"body":"What’s New New! format of POST /v2/apps/\u003capp id\u003e/run has changed.\nAuthentication Register a New User Example Request:\nPOST /v2/auth/register/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json { \"username\": \"test\", \"password\": \"opensesame\", \"email\": \"test@example.com\" } Optional Parameters:\n{ \"first_name\": \"test\", \"last_name\": \"testerson\" } Example Response:\nHTTP/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\": [] } Log in Example Request:\nPOST /v2/auth/login/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json {\"username\": \"test\", \"password\": \"opensesame\"} Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"token\": \"abc123\"} Cancel Account Example Request:\nDELETE /v2/auth/cancel/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Regenerate Token note\nThis command could require administrative privileges\nExample Request:\nPOST /v2/auth/tokens/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional Parameters:\n{ \"username\" : \"test\" \"all\" : \"true\" } Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"token\": \"abc123\"} Change Password Example Request:\nPOST /v2/auth/passwd/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"password\": \"foo\", \"new_password\": \"bar\" } Optional parameters:\n{\"username\": \"testuser\"} note\nUsing the username parameter requires administrative privileges and makes the password parameter optional.\nExample Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Applications List all Applications Example Request:\nGET /v2/apps HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Create an Application Example Request:\nPOST /v2/apps/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 Optional parameters:\n{\"id\": \"example-go\"} Example Response:\nHTTP/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\" } Destroy an Application Example Request:\nDELETE /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 List Application Details Example Request:\nGET /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } Update Application Details Example Request:\nPOST /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional parameters:\n{ \"owner\": \"test\" } Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 1.8.0 Content-Type: application/json Retrieve Application Logs Example Request:\nGET /v2/apps/example-go/logs/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional URL Query Parameters:\n?log_lines= Example Response:\nHTTP/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\" Run one-off Commands 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:\nHTTP/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\"} Certificates List all Certificates Example Request:\nGET /v2/certs HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Get Certificate Details Example Request:\nGET /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } Create Certificate Example Request:\nPOST /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:\nHTTP/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\" } Destroy a Certificate Example Request:\nDELETE /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Attach a Domain to a Certificate Example Request:\nPOST /v2/certs/foo/domain/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"domain\": \"test.com\" } Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Remove a Domain from a Certificate Example Request:\nDELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Pods List all Pods Example Request:\nGET /v2/apps/example-go/pods/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } List all Pods by Type Example Request:\nGET /v2/apps/example-go/pods/web/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Restart All Pods Example Request:\nPOST /v2/apps/example-go/pods/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] Restart Pods by Type Example Request:\nPOST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] Restart Pods by Type and Name Example Request:\nPOST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] Scale Pods Example Request:\nPOST /v2/apps/example-go/scale/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"web\": 3} Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Configuration List Application Configuration Example Request:\nGET /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } Create new Config Example Request:\nPOST /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:\nHTTP/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\" } Unset Config Variable Example Request:\nPOST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": null}} Example Response:\nHTTP/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\" } Domains List Application Domains Example Request:\nGET /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Add Domain Example Request:\nPOST /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {'domain': 'example.example.com'} Example Response:\nHTTP/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\" } Remove Domain Example Request:\nDELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Builds List Application Builds Example Request:\nGET /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Create Application Build Example Request:\nPOST /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:\n{ \"procfile\": { \"web\": \"./cmd\" } } Example Response:\nHTTP/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\" } Releases List Application Releases Example Request:\nGET /v2/apps/example-go/releases/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 } ] } List Release Details Example Request:\nGET /v2/apps/example-go/releases/v2/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 } Rollback Release Example Request:\nPOST /v2/apps/example-go/releases/rollback/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"version\": 1} Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"version\": 5} Keys List Keys Example Request:\nGET /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 \u003c...\u003e\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Add Key to User Example Request:\nPOST /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"id\": \"example\", \"public\": \"ssh-rsa \u003c...\u003e\" } Example Response:\nHTTP/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 \u003c...\u003e\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Remove Key from User Example Request:\nDELETE /v2/keys/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Permissions List Application Permissions note\nThis does not include the app owner.\nExample Request:\nGET /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"users\": [ \"test\", \"foo\" ] } Create Application Permission Example Request:\nPOST /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Remove Application Permission Example Request:\nDELETE /v2/apps/example-go/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 List Administrators Example Request:\nGET /v2/admin/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 } ] } Grant User Administrative Privileges note\nThis command requires administrative privileges\nExample Request:\nPOST /v2/admin/perms HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Remove User’s Administrative Privileges note\nThis command requires administrative privileges\nExample Request:\nDELETE /v2/admin/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Users List all users note\nThis command requires administrative privileges\nExample Request:\nGET /v2/users HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\": [] } ] } ","categories":"","description":"This is the v2.0 REST API for the Controller.","excerpt":"This is the v2.0 REST API for the Controller.","ref":"/docs/reference-guide/controller-api-v2-0/","tags":"","title":"Controller API v2.0"},{"body":"It’s useful to help keep the development team informed about deploys, while it can also be used to integrate different systems together.\nAfter one or more hooks are setup, hook output and errors appear in your application’s logs:\n$ 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.\nHTTP POST Hook 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:\napp=secure-woodland\u0026release=v4\u0026release_summary=gabrtv%20deployed%35b3726\u0026sha=35b3726\u0026user=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.\nIn 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:\nimport hashlib import hmac hmac.new(\"my_secret_key\", \"http://drycc.rocks?app=secure-woodland\u0026release=v4\u0026release_summary=gabrtv%20deployed%35b3726\u0026sha=35b3726\u0026user=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.\n!!! 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.\n","categories":"","description":"Deploy hooks allow an external service to receive a notification whenever a new version of your app is pushed to Workflow.","excerpt":"Deploy hooks allow an external service to receive a notification …","ref":"/docs/managing-workflow/deploy-hooks/","tags":"","title":"Deploy Hooks"},{"body":"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.\nAdd SSH Key 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.\nSee this document for instructions on how to generate an SSH key.\nRun drycc keys:add to upload your SSH key to Drycc Workflow.\n$ drycc keys:add ~/.ssh/id_drycc.pub Uploading id_drycc.pub to drycc... done Read more about adding/removing SSH Keys here.\nPrepare an Application If you do not have an existing application, you can clone an example application that demonstrates the Dockerfile workflow.\n$ git clone https://github.com/drycc/helloworld.git $ cd helloworld Dockerfile Requirements In order to deploy Dockerfile applications, they must conform to the following requirements:\nThe Dockerfile must use the EXPOSE directive to expose exactly one port. That port must be listening for an HTTP connection. The Dockerfile must use the CMD directive to define the default process that will run within the container. The Container image must contain bash to run processes. !!! 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.\nCreate an Application Use drycc create to create an application on the Controller.\n$ drycc create Creating application... done, created folksy-offshoot Git remote drycc added Push to Deploy Use git push drycc master to deploy your application.\n$ 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) -----\u003e Building Docker image Uploading context 4.096 kB Uploading context Step 0 : FROM drycc/base:latest ---\u003e 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 ---\u003e Using cache ---\u003e cf9ef8c5caa7 Step 2 : RUN tar -C /usr/local -xzf /tmp/go1.2.1.linux-amd64.tar.gz ---\u003e Using cache ---\u003e 515b1faf3bd8 Step 3 : RUN mkdir -p /go ---\u003e Using cache ---\u003e ebf4927a00e9 Step 4 : ENV GOPATH /go ---\u003e Using cache ---\u003e c6a276eded37 Step 5 : ENV PATH /usr/local/go/bin:/go/bin:$PATH ---\u003e Using cache ---\u003e 2ba6f6c9f108 Step 6 : ADD . /go/src/github.com/drycc/helloworld ---\u003e 94ab7f4b977b Removing intermediate container 171b7d9fdb34 Step 7 : RUN cd /go/src/github.com/drycc/helloworld \u0026\u0026 go install -v . ---\u003e Running in 0c8fbb2d2812 github.com/drycc/helloworld ---\u003e 13b5af931393 Removing intermediate container 0c8fbb2d2812 Step 8 : ENV PORT 80 ---\u003e Running in 9b07da36a272 ---\u003e 2dce83167874 Removing intermediate container 9b07da36a272 Step 9 : CMD [\"/go/bin/helloworld\"] ---\u003e Running in f7b215199940 ---\u003e b1e55ce5195a Removing intermediate container f7b215199940 Step 10 : EXPOSE 80 ---\u003e Running in 7eb8ec45dcb0 ---\u003e ea1a8cc93ca3 Removing intermediate container 7eb8ec45dcb0 Successfully built ea1a8cc93ca3 -----\u003e Pushing image to private registry Launching... done, v2 -----\u003e 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 -\u003e 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.\nUse 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.\nContainer Build Arguments 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:\n$ 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:\nARG POWERED_BY RUN echo \"Powered by $POWERED_BY\" \u003e /etc/motd ","categories":"","description":"Drycc Container Registry allows you to deploy your Docker-based app to Drycc. Both Common Runtime and Private Spaces are supported.","excerpt":"Drycc Container Registry allows you to deploy your Docker-based app to …","ref":"/docs/applications/using-dockerfiles/","tags":"","title":"Using Dockerfiles"},{"body":"In this guide, we walk you through the process of setting up a development environment that is suitable for hacking on most Drycc components.\nWe 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.\n!!! 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.\nIf 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.\nPrerequisites In order to successfully compile and test Drycc binaries and build Container images of Drycc components, the following are required:\ngit Go 1.5 or later, with support for compiling to linux/amd64 glide golint shellcheck Podman (in a non-Linux environment, you will additionally want [Podman Machine][machine]) For drycc/controller, in particular, you will also need:\nPython 2.7 or later (with pip) virtualenv (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.\nConfiguring Go 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.\nHomebrew users can just install with cross compiling support:\n$ brew install go --with-cc-common It is also straightforward to build Go from source:\n$ 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.\nFork the Repository Once the prerequisites have been met, we can begin to work with Drycc components.\nBegin 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/.\n$ mkdir -p $GOPATH/src/github.com/drycc $ cd $GOPATH/src/github.com/drycc $ git clone git@github.com:\u003cusername\u003e/\u003ccomponent\u003e.git $ cd \u003ccomponent\u003e !!! note By checking out the forked copy into the namespace github.com/drycc/\u003ccomponent\u003e, we are tricking the Go toolchain into seeing our fork as the “official” source tree.\nIf 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:\n$ git remote add upstream https://github.com/drycc/\u003ccomponent\u003e.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:\n$ export DRYCC=$GOPATH/src/github.com/drycc Throughout the rest of this document, $DRYCC refers to that location.\nAlternative: Forking with a Pushurl A number of Drycc contributors prefer to pull directly from drycc/\u003ccomponent\u003e, but push to \u003cusername\u003e/\u003ccomponent\u003e. If that workflow suits you better, you can set it up this way:\n$ git clone git@github.com:drycc/\u003ccomponent\u003e.git $ cd drycc $ git config remote.origin.pushurl git@github.com:\u003cusername\u003e/\u003ccomponent\u003e.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.\nMake Your Changes With your development environment set up and the code you wish to work on forked and cloned, you can begin making your changes.\nTest Your Changes Drycc components each include a comprehensive suite of automated tests, mostly written in Go. See testing for instructions on running the tests.\nDeploying Your Changes 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.\nRunning a Kubernetes Cluster for Development To run a Kubernetes cluster locally or elsewhere to support your development activities, refer to Drycc installation instructions here.\nUsing a Development Registry 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.\nIf 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.\nTo facilitate this, most Drycc components provide a make target to create such a registry:\n$ make dev-registry In a Linux environment, to begin using the registry:\nexport DRYCC_REGISTRY=\u003cIP of the host machine\u003e:5000 In non-Linux environments:\nexport DRYCC_REGISTRY=\u003cIP of the drycc Container Machine VM\u003e: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.\nTo use DockerHub for this purpose, for instance:\n$ export DRYCC_REGISTRY=\"registry.drycc.cc\" $ export IMAGE_PREFIX=\u003cyour DockerHub username\u003e To use quay.io:\n$ export DRYCC_REGISTRY=quay.io $ export IMAGE_PREFIX=\u003cyour quay.io username\u003e Note the importance of the trailing slash.\nDev / Deployment Workflow 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.\nIn the general case, this workflow looks like this:\nUpdate source code and commit your changes using git Use make build to build a new Container image Use make dev-release to generate Kubernetes manifest(s) Use make deploy to restart the component using the updated manifest This can be shortened to a one-liner using just the deploy target:\n$ make deploy Useful Commands 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:\nSee All Drycc Pods $ kubectl --namespace=drycc get pods Describe a Pod This is often useful for troubleshooting pods that are in pending or crashed states:\n$ kubectl --namespace=drycc describe -f \u003cpod name\u003e Tail Logs $ kubectl --namespace=drycc logs -f \u003cpod name\u003e Django Shell Specific to drycc/controller\n$ kubectl --namespace=drycc exec -it \u003cpod name\u003e -- python manage.py shell Have commands other Drycc contributors might find useful? Send us a PR!\nPull Requests Satisfied with your changes? Share them!\nPlease read Submitting a Pull Request. It contains a checklist of things you should do when proposing a change to any Drycc component.\n","categories":"","description":"This document is for developers who are interested in working directly on the Drycc codebase.","excerpt":"This document is for developers who are interested in working directly …","ref":"/docs/contribution-guidelines/development-environment/","tags":"","title":"Development Environment"},{"body":"Drycc Workflow Client CLI The Drycc command-line interface (CLI), lets you interact with Drycc Workflow. Use the CLI to create and configure and manage applications.\nInstall the drycc client for Linux or Mac OS X with:\n$ curl -sfL https://www.drycc.cc/install-cli.sh | bash - !!! important Users in Chinese mainland can use the following methods to speed up installation:\n``` $ curl -sfL https://www.drycc.cc/install-cli.sh | INSTALL_DRYCC_MIRROR=cn bash - ``` Others please visit: https://github.com/drycc/workflow-cli/releases\nThe installer places the drycc binary in your current directory, but you should move it somewhere in your $PATH:\n$ sudo ln -fs $PWD/drycc /usr/local/bin/drycc or:\n$ sudo mv $PWD/drycc /usr/local/bin/drycc Check your work by running drycc version:\n$ drycc version v1.1.0 Update workflow cli to latest release.\ndrycc update !!! note Note that version numbers may vary as new releases become available\n","categories":"","description":"How to download, install Drycc CLI tools.","excerpt":"How to download, install Drycc CLI tools.","ref":"/docs/quickstart/install-cli-tools/","tags":"","title":"Drycc Workflow Client CLI"},{"body":"","categories":"","description":"Deploying Drycc on a Kubernetes Cluster.\n","excerpt":"Deploying Drycc on a Kubernetes Cluster.\n","ref":"/docs/installing-workflow/","tags":"","title":"Installing To Kubenetes"},{"body":"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.\nThe master git branch of a project should always work. Only changes considered ready to be released publicly are merged.\nComponents Release as Needed 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.\nBy 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.\n“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.\nSee “How to Release a Component” for more detail.\nWorkflow Releases Each Month 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.\nWorkflow release timing is not linked to specific features. If a feature is merged before the release date, it is included in the next release.\nSee “How to Release Workflow” for more detail.\nSemantic Versioning Drycc releases comply with semantic versioning, with the “public API” broadly defined as:\nREST, gRPC, or other API that is network-accessible Library or framework API intended for public use “Pluggable” socket-level protocols users can redirect CLI commands and output formats 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.\nHow to Release a Component 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.\nStep 1: Update Code and Run the Release Tool 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.\nNote: if a patch release, the release artifact will have to be manually promoted by triggering the component-promote job with the following values:\nCOMPONENT_NAME=\u003ccomponent name\u003e COMPONENT_SHA=\u003cpatch commit sha\u003e Make sure you have the dryccrel release tool in your search $PATH.\nRun 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.)\n$ 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 -\u003e 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:\n$ 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 -\u003e 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 Step 2: Verify the Component is Available 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.\nDouble-check that the artifact is available, either by a podman pull command or by running the appropriate installer script.\nIf 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.\nIf 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):\n$ helm fetch oci://registry.drycc.cc/charts/controller --version 1.0.0 Verification: \u0026{0xc4207ec870 sha256:026e766e918ff28d2a7041bc3d560d149ee7eb0cb84165c9d9d00a3045ff45c3 controller-v1.0.1.tgz} How to Release Workflow Drycc Workflow integrates multiple component releases together with a Kubernetes Helm chart deliverable. This section leads a maintainer through creating a Workflow release.\nStep 1: Set Environment Variables Export two environment variables that will be used in later steps:\nexport WORKFLOW_RELEASE=v2.17.0 WORKFLOW_PREV_RELEASE=v2.16.0 # for example Step 2: Tag Supporting Repositories 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:\ndrycc/workflow-cli drycc/workflow-e2e The version number for drycc/workflow-cli should always match the overall Workflow version number.\nStep 3: Create Helm Chart To create and stage a release candidate chart for Workflow, we will build the workflow-chart-stage job with the following parameters:\nRELEASE_TAG=$WORKFLOW_RELEASE\nThis 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.\nStep 4: Manual Testing 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.\nTesters 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.\nWhen showstopper-level bugs are found, the process is as follows:\nCreate a component PR that fixes the bug. Once the PR passes and is reviewed, merge it and do a new component release Trigger the same workflow-chart-stage job as mentioned in Step 3 to upload the newly-generated Workflow release candidate chart to staging. Step 5: Release the Chart When testing has completed without uncovering any new showstopper bugs, kick off the workflow-chart-release job with the following parameter:\nRELEASE_TAG=$WORKFLOW_RELEASE\nThis 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.\nStep 6: Assemble Master Changelog 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.\nWe’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):\nhelm fetch --untar oci://registry.drycc.cc/charts/workflow --version $WORKFLOW_PREV_RELEASE dryccrel changelog global workflow/requirements.lock map.json \u003e 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.\nStep 7: Update Documentation 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.\nPlace 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.:\n## Workflow v2.16.0 -\u003e 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.\nStep 8: Close GitHub Milestones 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.\nMilestones map to Drycc Workflow releases in drycc/workflow. These milestones do not correspond to individual component release tags.\nStep 9: Release Workflow CLI Stable Now that the $WORKFLOW_RELEASE version of Workflow CLI has been vetted, we can push stable artifacts based on this version.\nKick 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:\n$ curl -sfL https://www.drycc.cc/install-cli.sh | bash - $ ./drycc version # (Should show $WORKFLOW_RELEASE) Step 10: Let Everyone Know 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:\n@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!\n","categories":"","description":"Drycc's release model allows applications to record and roll back to previous versions.","excerpt":"Drycc's release model allows applications to record and roll back to …","ref":"/docs/roadmap/releases/","tags":"","title":"Releases"},{"body":"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.\nGenerate an SSH Key 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:\n$ 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) Adding and Removing SSH Keys 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.\n$ 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:\n$ 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:\n$ drycc keys:remove admin@plinth-23437.local Removing admin@plinth-23437.local SSH Key... don ","categories":"","description":"Create, manage, and upload SSH keys to Drycc for use in deploying and connecting to applications.","excerpt":"Create, manage, and upload SSH keys to Drycc for use in deploying and …","ref":"/docs/users/ssh-keys/","tags":"","title":"Users and SSH Keys"},{"body":"Application has a Dockerfile, but a Buildpack Deployment Occurs 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:\nAre you deploying the correct project? Are you pushing the correct git branch (git push drycc \u003cbranch\u003e)? Is the Dockerfile in the project’s root directory? Have you committed the Dockerfile to the project? Application was Deployed, but is Failing to Start 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\n$ 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:\nEvents: 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.\nSee Custom Health Checks for more information on how to customize the application’s health checks to better suit the application’s needs.\n","categories":"","description":"This document describes how one can troubleshoot common issues when deploying or debugging an application that fails to start or deploy.","excerpt":"This document describes how one can troubleshoot common issues when …","ref":"/docs/troubleshooting/applications/","tags":"","title":"Troubleshooting Applications"},{"body":"Drycc Workflow ships with Storage by default, which provides in-cluster.\nConfiguring off-cluster Object Storage Every component that relies on object storage uses two inputs for configuration:\nYou must use object storage services that are compatible with S3 API Access credentials stored as a Kubernetes secret named 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.\nStep 1: Create storage buckets Create storage buckets for each of the Workflow subsystems: builder, registry, and database.\nDepending 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.\nIf you provide credentials with sufficient access to the underlying storage, Workflow components will create the buckets if they do not exist.\nStep 2: Generate storage credentials If applicable, generate credentials that have create and write access to the storage buckets created in Step 1.\nIf 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!\nStep 3: Configure Workflow Chart Operators should configure object storage by editing the Helm values file before running helm install. To do so:\nFetch the Helm values by running helm inspect values oci://registry.drycc.cc/charts/workflow \u003e values.yaml Update the global/storage parameter to reference the platform you are using, e.g. s3, azure, gcs, or swift Find the corresponding section for your storage type and provide appropriate values including region, bucket names, and access credentials. Save your changes. !!! 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:\n$ 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.\n","categories":"","description":"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.","excerpt":"A variety of Drycc Workflow components rely on an object storage …","ref":"/docs/installing-workflow/configuring-object-storage/","tags":"","title":"Configuring Object Storage"},{"body":"Drycc supports deploying applications via an existing Docker Image. This is useful for integrating Drycc into Docker-based CI/CD pipelines.\nPrepare an Application Start by cloning an example application:\n$ 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.\n$ docker build -t \u003cusername\u003e/example-dockerfile-http . $ docker push \u003cusername\u003e/example-dockerfile-http Docker Image Requirements In order to deploy Docker images, they must conform to the following requirements:\nThe Dockerfile must use the EXPOSE directive to expose exactly one port. That port must be listening for an HTTP connection. The Dockerfile must use the CMD directive to define the default process that will run within the container. The Docker image must contain bash to run processes. !!! 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.\nCreate an Application Use drycc create to create an application on the controller.\n$ mkdir -p /tmp/example-dockerfile-http \u0026\u0026 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.\nDeploy the Application Use drycc pull to deploy your application from DockerHub or a public registry.\n$ drycc pull \u003cusername\u003e/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.\nUse 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.\nPrivate Registry 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.\nTo deploy private Docker images, take the following steps:\nGather the username and password for the registry, such as a Quay.io Robot Account or a GCR.io Long Lived Token Run drycc registry:set username=\u003cthe-user\u003e password=\u003csecret\u003e -a \u003capplication-name\u003e Now perform drycc pull as normal, against an image in the private registry When 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:\ndrycc 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.\n!!! note Currently GCR.io and ECR in short lived auth token mode are not supported.\n","categories":"","description":"Deploy an application using a container image stored in your Drycc Container Registry.","excerpt":"Deploy an application using a container image stored in your Drycc …","ref":"/docs/applications/using-container-images/","tags":"","title":"Using Docker Images"},{"body":"What’s New New! healthcheck field in configuration, deprecates the HEALTHCHECK_* environment variables.\nNew! Unsetting a configuration variable that does not exist will return a 422.\nNew! Creating an identical sequential release returns a 409 rather than create a no-op release.\nAuthentication Register a New User Example Request:\nPOST /v2/auth/register/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json { \"username\": \"test\", \"password\": \"opensesame\", \"email\": \"test@example.com\" } Optional Parameters:\n{ \"first_name\": \"test\", \"last_name\": \"testerson\" } Example Response:\nHTTP/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\": [] } Log in Example Request:\nPOST /v2/auth/login/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json {\"username\": \"test\", \"password\": \"opensesame\"} Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"token\": \"abc123\"} Cancel Account Example Request:\nDELETE /v2/auth/cancel/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Regenerate Token note\nThis command could require administrative privileges\nExample Request:\nPOST /v2/auth/tokens/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional Parameters:\n{ \"username\" : \"test\" \"all\" : \"true\" } Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"token\": \"abc123\"} Change Password Example Request:\nPOST /v2/auth/passwd/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"password\": \"foo\", \"new_password\": \"bar\" } Optional parameters:\n{\"username\": \"testuser\"} note\nUsing the username parameter requires administrative privileges and makes the password parameter optional.\nExample Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Applications List all Applications Example Request:\nGET /v2/apps HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Create an Application Example Request:\nPOST /v2/apps/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 Optional parameters:\n{\"id\": \"example-go\"} Example Response:\nHTTP/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\" } Destroy an Application Example Request:\nDELETE /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 List Application Details Example Request:\nGET /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } Update Application Details Example Request:\nPOST /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional parameters:\n{ \"owner\": \"test\" } Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 1.8.0 Content-Type: application/json Retrieve Application Logs Example Request:\nGET /v2/apps/example-go/logs/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional URL Query Parameters:\n?log_lines= Example Response:\nHTTP/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\" Run one-off Commands 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:\nHTTP/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\"} Certificates List all Certificates Example Request:\nGET /v2/certs HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Get Certificate Details Example Request:\nGET /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } Create Certificate Example Request:\nPOST /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:\nHTTP/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\" } Destroy a Certificate Example Request:\nDELETE /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Attach a Domain to a Certificate Example Request:\nPOST /v2/certs/foo/domain/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"domain\": \"test.com\" } Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Remove a Domain from a Certificate Example Request:\nDELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Pods List all Pods Example Request:\nGET /v2/apps/example-go/pods/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } List all Pods by Type Example Request:\nGET /v2/apps/example-go/pods/web/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Restart All Pods Example Request:\nPOST /v2/apps/example-go/pods/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] Restart Pods by Type Example Request:\nPOST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] Restart Pods by Type and Name Example Request:\nPOST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] Scale Pods Example Request:\nPOST /v2/apps/example-go/scale/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"web\": 3} Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Configuration List Application Configuration Example Request:\nGET /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } Create new Config Example Request:\nPOST /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:\nHTTP/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\" } Unset Config Variable Example Request:\nPOST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": null}} Example Response:\nHTTP/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\" } Domains List Application Domains Example Request:\nGET /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Add Domain Example Request:\nPOST /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {'domain': 'example.example.com'} Example Response:\nHTTP/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\" } Remove Domain Example Request:\nDELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Builds List Application Builds Example Request:\nGET /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Create Application Build Example Request:\nPOST /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:\n{ \"procfile\": { \"web\": \"./cmd\" } } Example Response:\nHTTP/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\" } Releases List Application Releases Example Request:\nGET /v2/apps/example-go/releases/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 } ] } List Release Details Example Request:\nGET /v2/apps/example-go/releases/v2/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 } Rollback Release Example Request:\nPOST /v2/apps/example-go/releases/rollback/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"version\": 1} Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"version\": 5} Keys List Keys Example Request:\nGET /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 \u003c...\u003e\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Add Key to User Example Request:\nPOST /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"id\": \"example\", \"public\": \"ssh-rsa \u003c...\u003e\" } Example Response:\nHTTP/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 \u003c...\u003e\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Remove Key from User Example Request:\nDELETE /v2/keys/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Permissions List Application Permissions note\nThis does not include the app owner.\nExample Request:\nGET /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"users\": [ \"test\", \"foo\" ] } Create Application Permission Example Request:\nPOST /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Remove Application Permission Example Request:\nDELETE /v2/apps/example-go/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 List Administrators Example Request:\nGET /v2/admin/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 } ] } Grant User Administrative Privileges note\nThis command requires administrative privileges\nExample Request:\nPOST /v2/admin/perms HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Remove User’s Administrative Privileges note\nThis command requires administrative privileges\nExample Request:\nDELETE /v2/admin/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Users List all users note\nThis command requires administrative privileges\nExample Request:\nGET /v2/users HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\": [] } ] } ","categories":"","description":"This is the v2.1 REST API for the Controller.","excerpt":"This is the v2.1 REST API for the Controller.","ref":"/docs/reference-guide/controller-api-v2-1/","tags":"","title":"Controller API v2.1"},{"body":"Determine Your Host and Hostname Values Drycc workflow requires a wildcard DNS record to dynamically map app names to the router.\nUser 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.\nLogin to Workflow 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.\n$ 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\n$ drycc login http://drycc.example.com --username=demo --password=demo Configuration file written to /root/.drycc/client.json Deploy an Application 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.\nRun 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.\n$ 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.\nLet’s use the CLI to tell the platform to deploy an application and then use curl to send a request to the app:\n$ 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 \u003cappname\u003e!\nWorkflow’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.\nChange Application Configuration 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:\n$ 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!\nValidate that our configuration change has worked:\n$ curl http://proper-barbecue.104.197.125.75.nip.io Powered by Container Images + Kubernetes Scale Your Application 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:\n$ 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.\nGoing Further There is a lot more you can do with Drycc Workflow, play around with the CLI:\n!!! 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.\nRoll back to a previous release with drycc rollback -a proper-barbecue See application logs with drycc logs -a proper-barbecue Try one of our other example applications like: drycc/ruby-getting-started drycc/python-getting-started drycc/php-getting-started Read about using application Buildpacks or Dockerfiles Join our #community slack channel and meet the team! ","categories":"","description":"Deploy an application using drycc cli.","excerpt":"Deploy an application using drycc cli.","ref":"/docs/quickstart/deploy-an-app/","tags":"","title":"Deploy Your First App"},{"body":"The logging platform is made up of 2 components - Fluentbit and Logger.\nFluentbit 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.\nIf 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.\nLogger 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.\nConfiguring Off Cluster 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:\ndb = “0” host = “my.host.redis” port = “6379” password = \"\" These can be changed by running helm inspect values drycc/workflow \u003e 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.\nDebugging Logger If the drycc logs command encounters an error it will return the following message:\nError: 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 \u003clogger pod\u003e 3) Making sure that the container logs were mounted properly into the fluentbit pod: kubectl --namespace=drycc exec \u003cfluentbit pod\u003e ls /var/log/containers Architecture Diagram ┌────────┐ │ Router │ ┌────────┐ ┌─────┐ └────────┘ │ Logger │◀───▶│Redis│ │ └────────┘ └─────┘ Log file ▲ │ │ ▼ │ ┌────────┐ ┌─────────┐ logs/metrics ┌──────────────┐ │App Logs│──Log File──▶│Fluentbit│───────topics─────▶│ Redis Stream │ └────────┘ └─────────┘ └──────────────┘ Default Configuration 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.\n","categories":"","description":"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.","excerpt":"Logs are a stream of time-stamped events aggregated from the output …","ref":"/docs/managing-workflow/platform-logging/","tags":"","title":"Platform Logging"},{"body":"Each Drycc component includes its own suite of style checks, unit tests, and black-box type functional tests.\nIntegration tests verify the behavior of the Drycc components together as a system and are provided separately by the drycc/workflow-e2e project.\nGitHub 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.\nSet Up the Environment Successfully executing the unit and functional tests for any Drycc component requires that the Development Environment is set up first.\nRun the Tests The style checks, unit tests, and functional tests for each component can all be executed via make targets:\nTo execute style checks:\n$ make test-style To execute unit tests:\n$ make test-unit To execute functional tests:\n$ make test-functional To execute style checks, unit tests, and functional tests all in one shot:\n$ make test To execute integration tests, refer to drycc/workflow-e2e documentation.\n","categories":"","description":"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.","excerpt":"Each Drycc component is one among an ecosystem of such components - …","ref":"/docs/contribution-guidelines/testing/","tags":"","title":"Testing Drycc"},{"body":"","categories":"","description":"In this tutorial, you'll learn how to manage users.\n","excerpt":"In this tutorial, you'll learn how to manage users.\n","ref":"/docs/users/","tags":"","title":"Users"},{"body":"","categories":"","description":"A simple and scalable cloud platform for all developer needs.\n","excerpt":"A simple and scalable cloud platform for all developer needs.\n","ref":"/docs/applications/","tags":"","title":"Applications"},{"body":"Configuring Postgres 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.\nProvisioning off-cluster Postgres 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.\nTake note of the following:\nThe hostname or public IP of your PostgreSQL RDBMS The port on which your PostgreSQL RDBMS runs– typically 5432 Within the off-cluster RDBMS, manually provision the following:\nA database user (take note of the username and password) A database owned by that user (take note of its name) 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:\n$ psql -h \u003chost\u003e -p \u003cport\u003e -d postgres -U \u003c\"postgres\" or your own username\u003e \u003e create user \u003cdrycc username; typically \"drycc\"\u003e with password '\u003cpassword\u003e'; \u003e create database \u003cdatabase name; typically \"drycc\"\u003e with owner \u003cdrycc username\u003e; \u003e \\q Configuring Workflow The Helm chart for Drycc Workflow can be easily configured to connect the Workflow controller component to an off-cluster PostgreSQL database.\nStep 1: If you haven’t already fetched the values, do so with helm inspect values drycc/workflow \u003e values.yaml Step 2: Update database connection details by modifying values.yaml: Update the databaseLocation parameter to off-cluster. Update the values in the [database] configuration section to properly reflect all connection details. Update the values in the [controller] configuration section to properly reflect platformDomain details. Save your changes. Note: you do not need to (and must not) base64 encode any values, as the Helm chart will automatically handle encoding as necessary. You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml as usual.\n","categories":"","description":"Drycc Workflow's controller and passport component rely on a PostgreSQL database to store platform state.","excerpt":"Drycc Workflow's controller and passport component rely on a …","ref":"/docs/installing-workflow/configuring-postgres/","tags":"","title":"Configuring Postgres"},{"body":"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.\nConfiguring Off-Cluster Private Registry Every component that relies on a registry uses two inputs for configuration:\nRegistry Location environment variable named DRYCC_REGISTRY_LOCATION Access credentials stored as a Kubernetes secret named 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.\nWhen 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=\u003cport\u003e prior to deploying the application.\nDrycc Workflow currently supports:\noff-cluster: Any provider which supports long-lived username/password authentication, such as Azure Container Registry, Docker Hub, quay.io, or a self-hosted Container registry. Configuration If you haven’t already fetched the values file, do so with helm inspect values drycc/workflow \u003e values.yaml Update registry location details by modifying the values file: * Update the 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.\nExamples Here we show how the relevant parts of the fetched values.yaml file might look like after configuring for a particular off-cluster registry:\nAzure Container Registry (ACR) 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:\nglobal: ... 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.\nQuay.io global: ... registryLocation: \"off-cluster\" ... registry-token-refresher: ... registry: hostname: \"quay.io\" organization: \"myorg\" username: \"myusername\" password: \"mypassword\" ... ","categories":"","description":"Drycc Workflow's builder component relies on a registry for storing application container images.","excerpt":"Drycc Workflow's builder component relies on a registry for storing …","ref":"/docs/installing-workflow/configuring-registry/","tags":"","title":"Configuring Registry"},{"body":"What’s New New! /v2/auth/whoami endpoint\nAuthentication Register a New User Example Request:\nPOST /v2/auth/register/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json { \"username\": \"test\", \"password\": \"opensesame\", \"email\": \"test@example.com\" } Optional Parameters:\n{ \"first_name\": \"test\", \"last_name\": \"testerson\" } Example Response:\nHTTP/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\": [] } Log in Example Request:\nPOST /v2/auth/login/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json {\"username\": \"test\", \"password\": \"opensesame\"} Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json {\"token\": \"abc123\"} Cancel Account Example Request:\nDELETE /v2/auth/cancel/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Who Am I Example Request:\nGET /v2/auth/whoami/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\": [] } Regenerate Token note\nThis command could require administrative privileges\nExample Request:\nPOST /v2/auth/tokens/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional Parameters:\n{ \"username\" : \"test\" \"all\" : \"true\" } Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json {\"token\": \"abc123\"} Change Password Example Request:\nPOST /v2/auth/passwd/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"password\": \"foo\", \"new_password\": \"bar\" } Optional parameters:\n{\"username\": \"testuser\"} note\nUsing the username parameter requires administrative privileges and makes the password parameter optional.\nExample Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Applications List all Applications Example Request:\nGET /v2/apps HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Create an Application Example Request:\nPOST /v2/apps/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 Optional parameters:\n{\"id\": \"example-go\"} Example Response:\nHTTP/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\" } Destroy an Application Example Request:\nDELETE /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 List Application Details Example Request:\nGET /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } Update Application Details Example Request:\nPOST /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional parameters:\n{ \"owner\": \"test\" } Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 1.8.0 Content-Type: application/json Retrieve Application Logs Example Request:\nGET /v2/apps/example-go/logs/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional URL Query Parameters:\n?log_lines= Example Response:\nHTTP/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\" Run one-off Commands 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:\nHTTP/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\"} Certificates List all Certificates Example Request:\nGET /v2/certs HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Get Certificate Details Example Request:\nGET /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } Create Certificate Example Request:\nPOST /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:\nHTTP/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\" } Destroy a Certificate Example Request:\nDELETE /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Attach a Domain to a Certificate Example Request:\nPOST /v2/certs/foo/domain/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"domain\": \"test.com\" } Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Remove a Domain from a Certificate Example Request:\nDELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Pods List all Pods Example Request:\nGET /v2/apps/example-go/pods/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } List all Pods by Type Example Request:\nGET /v2/apps/example-go/pods/web/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Restart All Pods Example Request:\nPOST /v2/apps/example-go/pods/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] Restart Pods by Type Example Request:\nPOST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] Restart Pods by Type and Name Example Request:\nPOST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] Scale Pods Example Request:\nPOST /v2/apps/example-go/scale/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"web\": 3} Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Configuration List Application Configuration Example Request:\nGET /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } Create new Config Example Request:\nPOST /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:\nHTTP/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\" } Unset Config Variable Example Request:\nPOST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": null}} Example Response:\nHTTP/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\" } Domains List Application Domains Example Request:\nGET /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Add Domain Example Request:\nPOST /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {'domain': 'example.example.com'} Example Response:\nHTTP/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\" } Remove Domain Example Request:\nDELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Builds List Application Builds Example Request:\nGET /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Create Application Build Example Request:\nPOST /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:\n{ \"procfile\": { \"web\": \"./cmd\" } } Example Response:\nHTTP/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\" } Releases List Application Releases Example Request:\nGET /v2/apps/example-go/releases/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 } ] } List Release Details Example Request:\nGET /v2/apps/example-go/releases/v2/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 } Rollback Release Example Request:\nPOST /v2/apps/example-go/releases/rollback/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"version\": 1} Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json {\"version\": 5} Keys List Keys Example Request:\nGET /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 \u003c...\u003e\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Add Key to User Example Request:\nPOST /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"id\": \"example\", \"public\": \"ssh-rsa \u003c...\u003e\" } Example Response:\nHTTP/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 \u003c...\u003e\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Remove Key from User Example Request:\nDELETE /v2/keys/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Permissions List Application Permissions note\nThis does not include the app owner.\nExample Request:\nGET /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"users\": [ \"test\", \"foo\" ] } Create Application Permission Example Request:\nPOST /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Remove Application Permission Example Request:\nDELETE /v2/apps/example-go/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 List Administrators Example Request:\nGET /v2/admin/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 } ] } Grant User Administrative Privileges note\nThis command requires administrative privileges\nExample Request:\nPOST /v2/admin/perms HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Remove User’s Administrative Privileges note\nThis command requires administrative privileges\nExample Request:\nDELETE /v2/admin/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Users List all users note\nThis command requires administrative privileges\nExample Request:\nGET /v2/users HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\": [] } ] } ","categories":"","description":"This is the v2.2 REST API for the Controller.","excerpt":"This is the v2.2 REST API for the Controller.","ref":"/docs/reference-guide/controller-api-v2-2/","tags":"","title":"Controller API v2.2"},{"body":"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.\nBy 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 \u003cptype\u003e=\u003cn\u003e to scale those types accordingly.\nDefault Process Types In the absence of a Procfile, a single, default process type is assumed for each application.\nApplications 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:\nweb: bundle exec rails server -p $PORT All applications utilizing Dockerfiles have an implied web process type, which runs the Dockerfile’s CMD directive unmodified:\n$ 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.\nApplications utilizing remote Container images, a web process type is also implied, and runs the CMD specified in the Container image.\n!!! 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.\nDeclaring Process Types 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.\nThe format of a Procfile is one process type per line, with each line containing the command to invoke:\n\u003cprocess type\u003e: \u003ccommand\u003e The syntax is defined as:\n\u003cprocess type\u003e – a lowercase alphanumeric string, is a name for your command, such as web, worker, urgentworker, clock, etc. \u003ccommand\u003e – 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.\n$ 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.\nFor example, passing process types inline:\n$ drycc pull drycc/example-go:latest --procfile=\"web: /app/bin/boot\" Read a Procfile in another directory:\n$ drycc pull drycc/example-go:latest --procfile=\"$(cat deploy/Procfile)\" Or via a Procfile located in your current, working directory:\n$ 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.\nTo remove a process type simply scale it to 0:\n$ 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 Scaling Processes Applications deployed on Drycc Workflow scale out via the process model. Use drycc scale to control the number of containers that power your app.\n$ 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.\nIn this example, we are scaling the process type web to 5 but leaving the process type background with one worker.\n$ 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.\nFor example, scaling from 5 processes to 3:\n$ 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 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.\nThis feature is built on top of Horizontal Pod Autoscaling in Kubernetes or HPA for short.\n!!! note This is an alpha feature. It is recommended to be on the latest Kubernetes when using this feature.\n$ 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\n$ drycc autoscale:list PTYPE PERCENT MIN MAX web 75 3 8 Remove scaling rule\n$ 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.\nScale 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.\nFetch a container logs of the application List the containers:\n$ 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:\n$ 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 Get a container info of the application List the containers:\n$ 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 a container of the application Delete the containers. Due to the set number of replicas, a new container will be launched to meet the quantity requirement.\n$ drycc ps:delete python-getting-started-web-69b7d4bfdc-kl4xf Deleting python-getting-started-web-69b7d4bfdc-kl4xf from python-getting-started... done Get a Shell to a Running Container Verify that the container is running:\n$ 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:\n$ drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -it -- bash In your shell, list the root directory:\n# Run this inside the container ls / Running individual commands in a container\n$ 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).\nRestarting an Application Processes 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.\n$ 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.\nUse “drycc pts –help” for a list of pts command-line (process types info).\nList an Application Process Types $ 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 Get deployment info of the application process type $ 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 ","categories":"","description":"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.","excerpt":"A Procfile is a list of process types in an app. Each process type …","ref":"/docs/applications/managing-app-processes/","tags":"","title":"Managing Application Processes"},{"body":"","categories":"","description":"Managing Workflow using the kubectl.\n","excerpt":"Managing Workflow using the kubectl.\n","ref":"/docs/managing-workflow/","tags":"","title":"Managing Workflow"},{"body":"Description We now include a monitoring stack for introspection on a running Kubernetes cluster. The stack includes 4 components:\nkube-state-metrics, kube-state-metrics (KSM) is a simple service that listens to the Kubernetes API server and generates metrics about the state of the objects. Node Exporter, Prometheus exporter for hardware and OS metrics exposed by *NIX kernels. Prometheus, a Cloud Native Computing Foundation project, is a systems and service monitoring system. Grafana, Graphing tool for time series data Architecture Diagram ┌────────────────┐ │ HOST │ │ node-exporter │◀──┐ ┌──────────────────┐ └────────────────┘ │ │kube-state-metrics│ │ └──────────────────┘ ┌────────────────┐ │ ▲ │ HOST │ │ ┌────────────┐ │ │ node-exporter │◀──┼────│ Prometheus │─────────────┘ └────────────────┘ │ └────────────┘ │ ▲ ┌───────────────┐ │ │ │ HOST │ │ ▼ │ node-exporter│◀───┘ ┌──────────┐ └───────────────┘ │ Grafana │ └──────────┘ 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][].\nGrafana 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.\nDrycc 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.\nProduction Configuration A production install of Grafana should have the following configuration values changed if possible:\nChange the default username and password from 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. Enable persistence Use a supported external database such as mysql or postgres. You can find more information here On Cluster Persistence 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.\nIf you wish to have persistence for Grafana you can set enabled to true in the values.yaml file before running helm install.\ngrafana: # 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 Off Cluster Grafana If you wish to provide your own Grafana instance you can set grafanaLocation in the values.yaml file before running helm install.\nPrometheus 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.\nOn Cluster Persistence 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.\nprometheus: prometheus-server: persistence: enabled: true # Set to true to enable persistence size: 10Gi # PVC size node-exporter: enabled: true kube-state-metrics: enabled: true Off Cluster Prometheus To use off-cluster Prometheus, please provide the following values in the values.yaml file before running helm install.\nglobal.prometheusLocation=off-cluster url = \"http://my.prometheus.url:9090\" ","categories":"","description":"Platform monitoring to your apps to spot issues in advance and respond to incidents quickly.","excerpt":"Platform monitoring to your apps to spot issues in advance and respond …","ref":"/docs/managing-workflow/platform-monitoring/","tags":"","title":"Platform Monitoring"},{"body":"Design Document Before opening a pull request, ensure your change also references a design document if the contribution is substantial. For more information, see Design Documents.\nSingle Issue 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.\nSquash 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.\nMost 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.\nInclude Tests 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.\nSee testing for more information.\nInclude Docs 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.\nCross-repo commits 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.\nFor 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:\nfeat(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.\nLastly, the final PR in drycc/controller should be created with the required PR number(s) listed, in the form of [Rr]equires \u003crepoName\u003e#\u003cpullRequestNumber\u003e, for use by the downstream e2e run.\nfeat(foo): add feature foo Requires workflow-e2e#42 Code Standards 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.\nGo 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.\nPython 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.\nCommit Style We follow a convention for commit messages borrowed from CoreOS, who borrowed theirs from AngularJS. This is an example of a commit:\nfeat(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:\n{type}({scope}): {subject} \u003cBLANK LINE\u003e {body} \u003cBLANK LINE\u003e {footer} The allowed {types} are as follows:\nfeat -\u003e feature fix -\u003e bug fix docs -\u003e documentation style -\u003e formatting ref -\u003e refactoring code test -\u003e adding missing tests chore -\u003e maintenance The {scope} can be anything specifying the location(s) of the commit change(s).\nThe {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.\nJust 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.\nAll 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.\nAny 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.\nMerge Approval 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.\nNo 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.\nIf 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.\nAn 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.\n","categories":"","description":"Proposed changes to Drycc projects are made as GitHub pull requests.","excerpt":"Proposed changes to Drycc projects are made as GitHub pull requests.","ref":"/docs/contribution-guidelines/submitting-a-pull-request/","tags":"","title":"Submitting a Pull Request"},{"body":"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.\nDrycc 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.\nEngine 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.\nDrycc 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.\nOpen Source Bounties 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.\n","categories":"","description":"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.","excerpt":"Drycc is an open source project that anyone in the community can use, …","ref":"/docs/contribution-guidelines/community/","tags":"","title":"Community"},{"body":"What’s New New! /v2/apps/{name}/logs endpoint was fixed and no longer returns b'log data' and instead returns a normal string log data\nAuthentication Register a New User Example Request:\nPOST /v2/auth/register/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json { \"username\": \"test\", \"password\": \"opensesame\", \"email\": \"test@example.com\" } Optional Parameters:\n{ \"first_name\": \"test\", \"last_name\": \"testerson\" } Example Response:\nHTTP/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\": [] } Log in Example Request:\nPOST /v2/auth/login/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json {\"username\": \"test\", \"password\": \"opensesame\"} Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json {\"token\": \"abc123\"} Cancel Account Example Request:\nDELETE /v2/auth/cancel/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Who Am I Example Request:\nGET /v2/auth/whoami/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\": [] } Regenerate Token note\nThis command could require administrative privileges\nExample Request:\nPOST /v2/auth/tokens/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional Parameters:\n{ \"username\" : \"test\" \"all\" : \"true\" } Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json {\"token\": \"abc123\"} Change Password Example Request:\nPOST /v2/auth/passwd/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"password\": \"foo\", \"new_password\": \"bar\" } Optional parameters:\n{\"username\": \"testuser\"} note\nUsing the username parameter requires administrative privileges and makes the password parameter optional.\nExample Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Applications List all Applications Example Request:\nGET /v2/apps HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Create an Application Example Request:\nPOST /v2/apps/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 Optional parameters:\n{\"id\": \"example-go\"} Example Response:\nHTTP/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\" } Destroy an Application Example Request:\nDELETE /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 List Application Details Example Request:\nGET /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } Update Application Details Example Request:\nPOST /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional parameters:\n{ \"owner\": \"test\" } Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 1.8.0 Content-Type: application/json Retrieve Application Logs Example Request:\nGET /v2/apps/example-go/logs/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional URL Query Parameters:\n?log_lines= Example Response:\nHTTP/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\" Run one-off Commands 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:\nHTTP/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\"} Certificates List all Certificates Example Request:\nGET /v2/certs HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Get Certificate Details Example Request:\nGET /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } Create Certificate Example Request:\nPOST /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:\nHTTP/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\" } Destroy a Certificate Example Request:\nDELETE /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Attach a Domain to a Certificate Example Request:\nPOST /v2/certs/foo/domain/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"domain\": \"test.com\" } Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Remove a Domain from a Certificate Example Request:\nDELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Enable or disable TLS Example Request:\nPOST /v2/apps/example-go/tls/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 { \"https_enforced\": true } Example Response:\nHTTP/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\" } Get TLS status Example Request:\nGET /v2/apps/example-go/tls/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } Pods List all Pods Example Request:\nGET /v2/apps/example-go/pods/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } List all Pods by Type Example Request:\nGET /v2/apps/example-go/pods/web/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Restart All Pods Example Request:\nPOST /v2/apps/example-go/pods/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] Restart Pods by Type Example Request:\nPOST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] Restart Pods by Type and Name Example Request:\nPOST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] Scale Pods Example Request:\nPOST /v2/apps/example-go/scale/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"web\": 3} Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Configuration List Application Configuration Example Request:\nGET /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } Create new Config Example Request:\nPOST /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:\nHTTP/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\" } Unset Config Variable Example Request:\nPOST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": null}} Example Response:\nHTTP/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\" } Domains List Application Domains Example Request:\nGET /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Add Domain Example Request:\nPOST /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {'domain': 'example.example.com'} Example Response:\nHTTP/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\" } Remove Domain Example Request:\nDELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Builds List Application Builds Example Request:\nGET /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\" } ] } Create Application Build Example Request:\nPOST /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:\n{ \"procfile\": { \"web\": \"./cmd\" } } Example Response:\nHTTP/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\" } Releases List Application Releases Example Request:\nGET /v2/apps/example-go/releases/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 } ] } List Release Details Example Request:\nGET /v2/apps/example-go/releases/v2/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 } Rollback Release Example Request:\nPOST /v2/apps/example-go/releases/rollback/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"version\": 1} Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json {\"version\": 5} Keys List Keys Example Request:\nGET /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 \u003c...\u003e\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Add Key to User Example Request:\nPOST /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"id\": \"example\", \"public\": \"ssh-rsa \u003c...\u003e\" } Example Response:\nHTTP/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 \u003c...\u003e\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Remove Key from User Example Request:\nDELETE /v2/keys/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Permissions List Application Permissions note\nThis does not include the app owner.\nExample Request:\nGET /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"users\": [ \"test\", \"foo\" ] } Create Application Permission Example Request:\nPOST /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Remove Application Permission Example Request:\nDELETE /v2/apps/example-go/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 List Administrators Example Request:\nGET /v2/admin/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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 } ] } Grant User Administrative Privileges note\nThis command requires administrative privileges\nExample Request:\nPOST /v2/admin/perms HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response:\nHTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Remove User’s Administrative Privileges note\nThis command requires administrative privileges\nExample Request:\nDELETE /v2/admin/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Users List all users note\nThis command requires administrative privileges\nExample Request:\nGET /v2/users HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response:\nHTTP/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\": [] } ] } ","categories":"","description":"This is the v2.3 REST API for the Controller.","excerpt":"This is the v2.3 REST API for the Controller.","ref":"/docs/reference-guide/controller-api-v2-3/","tags":"","title":"Controller API v2.3"},{"body":"Configuring an Application A Drycc application stores config in environment variables.\nSetting Environment Variables Use drycc config to modify environment variables for a deployed application.\n$ 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.\nYou can set multiple environment variables with one drycc config:set command, or with drycc config:push and a local .env file.\n$ drycc config:set FOO=1 BAR=baz \u0026\u0026 drycc config:pull $ cat .env FOO=1 BAR=baz $ echo \"TIDE=high\" \u003e\u003e .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.\n$ drycc config:set FOO=1 BAR=baz --ptype=web Attach to Backing Services Drycc treats backing services like databases, caches and queues as attached resources. Attachments are performed using environment variables.\nFor example, use drycc config to set a DATABASE_URL that attaches the application to an external PostgreSQL database.\n$ 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.\nBuildpacks Cache 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.\nDisabling and re-enabling 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.\nClearing the cache Use the following procedure to clear the cache:\n$ 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 Custom Health Checks 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.\nThe 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.\nA liveness probe is useful for applications running for long periods of time, eventually transitioning to broken states and cannot recover except by restarting them.\nOther 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.\nhttpGet 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.\nexec 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.\ntcpSocket 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.\nHealth 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:\n$ 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:\n$ 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:\n$ 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:\n$ 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.\nAutodeploy By default, Changes the config, limits or healthchecks and so on will trigger deploy. If you don’t want deploy, you can disable.\n$ drycc autodeploy:disable To re-enable autodeploy.\ndrycc autodeploy:enable you can deploy by executing the following command. deploy all ptypes\ndrycc releases:deploy deploy web process type, and support --force option to force deploy.\ndrycc releases:deploy web --force Autorollback By default, deployment failures will roll back to the previous successful version. If you don’t want this to happen, you can disable.\n$ drycc autorollback:disable To re-enable autorollback.\ndrycc autorollback:enable Isolate the Application Workflow supports isolating applications onto a set of nodes using drycc tags.\n!!! 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”.\nOnce your nodes are configured with appropriate label selectors, use drycc tags:set to restrict the application ptype to those nodes:\n$ drycc tags:set web environ=prod Applying tags... done, v4 environ prod ","categories":"","description":"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.","excerpt":"How to store configuration of a Drycc app in the environment, keeping …","ref":"/docs/applications/managing-app-configuration/","tags":"","title":"Configuring an Application"},{"body":"Create an authentication token Create an authentication token using the drycc client.\n# 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\" ! \u003e yes UUID USERNAME TOKEN 58176cf1-37a8-4c52-9b27-4c7a47269dfb admin 1F2c7A802aF640fd9F31dD846AdDf56BcMsay Add scrape configurations for prometheus A valid example file can be found here.\nThe global configuration specifies parameters that are valid in all other configuration contexts. They also serve as defaults for other configuration sections.\nglobal: scrape_interval: 60s evaluation_interval: 60s scrape_configs: - job_name: 'drycc' scheme: https metrics_path: /v2/apps/\u003cappname\u003e/metrics authorization: type: Token credentials: 1F2c7A802aF640fd9F31dD846AdDf56BcMsay static_configs: - targets: ['drycc.domain.com'] ","categories":"","description":"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.","excerpt":"Metrics supports basic monitoring capabilities for Pod, providing …","ref":"/docs/applications/managing-app-metrics/","tags":"","title":"Managing Application Metrics"},{"body":"Running Workflow without drycc storage 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.\nRunning a Workflow cluster without Storage provides several advantages:\nRemoval of state from the worker nodes Reduced resource usage Reduced complexity and operational burden of managing Workflow See Configuring Object Storage for details on removing this operational complexity.\nReview Security Considerations There are some additional security-related considerations when running Workflow in production. See [Security Considerations][] for details.\nRegistration is Admin-Only 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.\nPlease see the following documentation to learn about changing registration mode:\nCustomizing Controller Disable Grafana Signups It is also recommended to disable signups for the Grafana dashboards.\nPlease see the following documentation to learn about disabling Grafana signups:\nCustomizing Monitor Running Workflow with RBAC 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:\nyour Kubernetes cluster is in GKE your Kubernetes cluster built with kubeadm Note: helm may need to be given specific permissions under RBAC if not already done.\nAttention: 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.\n","categories":"","description":"When readying a Workflow deployment for production workloads, there are some additional recommendations.","excerpt":"When readying a Workflow deployment for production workloads, there …","ref":"/docs/managing-workflow/production-deployments/","tags":"","title":"Production Deployments"},{"body":"This upgrade process requires:\nHelm version 2.1.0 or newer Configured Off-Cluster Storage Upgrade Process !!! 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.\nStep 1: Apply the Workflow upgrade 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.\nIf 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.\nFirst, find the name of the release helm gave to your deployment with helm ls, then run\n$ helm upgrade \u003crelease-name\u003e 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:\n$ B64_KEY_JSON=\"$(cat ~/path/to/key.json | base64 -w 0)\" $ helm upgrade \u003crelease_name\u003e 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.\nStep 2: Verify Upgrade Verify that all components have started and passed their readiness checks:\n$ 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 Step 3: Upgrade the Drycc Client 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.\ncurl -sfL https://www.drycc.cc/install-cli.sh | bash - \u0026\u0026 sudo mv drycc $(which drycc) ","categories":"","description":"Drycc Workflow releases may be upgraded in-place with minimal downtime.","excerpt":"Drycc Workflow releases may be upgraded in-place with minimal …","ref":"/docs/managing-workflow/upgrading-workflow/","tags":"","title":"Upgrading Workflow"},{"body":"Track Application Changes 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).\nEach time a build or config change is made to your application a new release is created. These release numbers increase monotonically.\nYou can see a record of changes to your application using drycc releases:\n$ 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 Rollback a 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.\n!!! note All rollbacks create a new, numbered release. But will reference the build/code and configuration from the desired rollback point.\nIn 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:\n$ 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:\n$ 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 Run One-off Administration Tasks Drycc applications use one-off processes for admin tasks like database migrations and other commands that must run against the live application.\nUse drycc run to execute commands on the deployed application.\n$ 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 Share an Application Use drycc perms:add to allow another Drycc user to collaborate on your application.\n$ 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.\n!!! note Collaborators can do anything with an application that its owner can do, except delete the application.\nWhen 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.\n$ 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 -\u003e drycc/master Application Troubleshooting 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.\nUse drycc logs to view the log output from your deployed application.\n$ 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 ","categories":"","description":"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.","excerpt":"This is a high-level, technical description of how Drycc works. It …","ref":"/docs/applications/managing-app-lifecycle/","tags":"","title":"Managing an Application"},{"body":"Triage helps ensure issues resolve quickly by:\nDescribing the issue’s intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences an problem and what actions they took. Giving a contributor the information they need before they commit to resolving an issue. Lowering the issue count by preventing duplicate issues. Streamlining the development process by preventing duplicate discussions. 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.\nEnsure the Issue Contains Basic Information 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:\nthe version(s) of Drycc this issue affects a reproducible case if this is a bug page URL if this is a docs issue or the name of a man page 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.\nIf 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.\nIf 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.\nClassifying the Issue An issue can have multiple of the following labels:\nIssue Kind 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. Functional Area builder cache contrib and provisioning client controller database docs kubernetes registry router store (Ceph) tests Easy Fix “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.\nPrioritizing issues When attached to a specific milestone, an issue can be attributed one of the following labels to indicate their degree of priority.\nPriority 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.\n","categories":"","description":"Issue triage provides an important way to contribute to an open source project.","excerpt":"Issue triage provides an important way to contribute to an open source …","ref":"/docs/contribution-guidelines/triaging-issues/","tags":"","title":"Triaging Issues"},{"body":"","categories":"","description":"Troubleshooting is systematic approach to problem-solving.\n","excerpt":"Troubleshooting is systematic approach to problem-solving.\n","ref":"/docs/troubleshooting/","tags":"","title":"Troubleshooting"},{"body":"Conduct The Drycc community welcomes and encourages participation by everyone.\nNo 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.\nThe 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:\nBe welcoming, friendly, and patient.\nBe considerate.\nYour 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.\nBe respectful. 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.\nBe careful in the words that you choose. 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.\n(Thanks to the Debian and Django communities for their text and their inspiration.)\n","categories":"","description":"The Drycc community welcomes and encourages participation by **everyone**.","excerpt":"The Drycc community welcomes and encourages participation by …","ref":"/docs/contribution-guidelines/conduct/","tags":"","title":"Conduct"},{"body":"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.\nUse drycc volumes to mount a volume for a deployed application’s processes.\n$ 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. Create a volume for the application You can create a csi volume with the drycc volumes:create command.\n$ drycc volumes:create myvolume 200M Creating myvolumes to scenic-icehouse... done Or use an existing nfs server\n$ drycc volumes:create myvolume 200M -t nfs --nfs-server=nfs.drycc.com --nfs-path=/ Creating myvolumes to scenic-icehouse... done List volumes in the application After volume is created, you can list the volumes in this application.\n$ drycc volumes:list === scenic-icehouse volumes --- myvolumes 200M Mount a volume 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.\n$ drycc volumes:mount myvolumes web=/data/web Mounting volume... done And use drycc volumes:list show mount detail.\n$ 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.\n$ drycc volumes:unmount myvolumes web Unmounting volume... done $ drycc volumes:delete myvolumes Deleting myvolumes from scenic-icehouse... done Use volume client to manage volume files. Assume the volume which is named myvolumes is created and mounted.\nPrepare a file named testfile.\n$ echo \"testtext\" \u003e testfile Upload. $ drycc volumes:client cp testfile vol://myvolume/ [↑] testfile 100% [==================================================] (5/ 5 B, 355 B/s)\nList files in myvolume.\n$ drycc volumes:client ls vol://myvolume/ [2024-07-22T15:32:28+08:00] 5 testfile Delete testfle in myvolume.\n$ drycc volumes:client rm vol://myvolume/testfile ","categories":"","description":"Drycc supports many types of volumes. A container can use any number of volume types simultaneously.","excerpt":"Drycc supports many types of volumes. A container can use any number …","ref":"/docs/applications/managing-app-volumes/","tags":"","title":"Mounting volumes for an Application"},{"body":"","categories":"","description":"Browse the ever-growing list of up-to-date, community driven roadmaps.\n","excerpt":"Browse the ever-growing list of up-to-date, community driven roadmaps. …","ref":"/docs/roadmap/","tags":"","title":"Roadmap"},{"body":"","categories":"","description":"This HowTo is for project maintainers who need a Contributing Guide for their project.\n","excerpt":"This HowTo is for project maintainers who need a Contributing Guide …","ref":"/docs/contribution-guidelines/","tags":"","title":"Contribution Guidelines"},{"body":"What is a maintainer? (Unabashedly stolen from the Podman project)\nThere are different types of maintainers, with different responsibilities, but all maintainers have 3 things in common:\nThey share responsibility in the project’s success. They have made a long-term, recurring time investment to improve the project. They spend that time doing whatever needs to be done, not necessarily what is the most interesting or fun. 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.\nDrycc maintainers Drycc has two groups of maintainers in addition to our beloved Benevolent Dictator for Life.\nBDFL Drycc follows the timeless, highly efficient and totally unfair system known as Benevolent dictator for life.\nGabriel 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.\nCore maintainers Core maintainers are exceptionally knowledgeable about all areas of Drycc. Some maintainers work on Drycc full-time, although this is not a requirement.\nThe duties of a core maintainer include:\nClassify and respond to GitHub issues and review pull requests Help to shape the Drycc roadmap and lead efforts to accomplish roadmap milestones Participate actively in feature development and bug fixing Answer questions and help users in the Drycc #community Slack channel The current list of core maintainers can be seen here.\nNo 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.\nContributing maintainers 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.\nThe 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.\nContributing 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.\nBecoming a maintainer 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.\nThe 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.\nGenerally, potential contributing maintainers are selected by the Drycc core maintainers based in part on the following criteria:\nSustained contributions to the project over a period of time (usually months) A willingness to help Drycc users on GitHub and in the Drycc #community Slack channel A friendly attitude :) 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.\n","categories":"","description":"This document serves to describe the leadership structure of the Drycc project, and list the current project maintainers.","excerpt":"This document serves to describe the leadership structure of the Drycc …","ref":"/docs/contribution-guidelines/maintainers/","tags":"","title":"Drycc Maintainers"},{"body":"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.\nCreate Gateway for an Application 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.\nList the containers:\n# 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.\n# drycc gateways:add python-getting-started --port=443 --protocol=HTTPS Adding gateway python-getting-started to python-getting-started... done Create service for an Application 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.\nList the services:\n$ 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\n# drycc services:add --help # drycc services:add sleep 8001:8001 Create Route for an Application 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.\n# 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.\ndrycc routes:create sleep --ptype=sleep --kind=HTTPRoute --port=8001 drycc routes:attach sleep --gateway=python-getting-started --port=80 ","categories":"","description":"A Gateway describes how traffic can be translated to Services within the cluster.","excerpt":"A Gateway describes how traffic can be translated to Services within …","ref":"/docs/applications/managing-app-gateway/","tags":"","title":"About gateway for an Application"},{"body":"We can use blow command to create resources and bind which resource is created. This command depend on service-catalog.\nUse drycc resources to create and bind a resource for a deployed application.\n$ 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. List all available resource services You can list available resource services with one drycc resources:services command\n$ 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 List all available plans for an resource services You can list all available plans for an resource services with one drycc resources:plans command\n$ 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. Create resource in application You can create a resource with one drycc resources:create command\n$ drycc resources:create redis:1000 redis Creating redis to scenic-icehouse... done After resources are created, you can list the resources in this application.\n$ drycc resources:list UUID NAME OWNER PLAN UPDATED 07220e9e-d54d-4d74-a88c-f464aa374386 redis admin redis:standard-128 2024-05-08T01:01:00Z Bind resources The resource which is named redis is created, you can bind the redis to the application, use the command of drycc resources:bind redis.\n$ drycc resources:bind redis Binding resource... done Describe resources 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.\n$ 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 Update resources 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:\n$ drycc resources:update redis:10000 redis Updating redis to scenic-icehouse... done Remove the resource 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.\n$ drycc resources:unbind redis Unbinding resource... done $ drycc resources:destroy redis Deleting redis from scenic-icehouse... done ","categories":"","description":"Tools and services for developing, extending, and operating your app.","excerpt":"Tools and services for developing, extending, and operating your app.","ref":"/docs/applications/managing-app-resources/","tags":"","title":"Managing resources for an Application"},{"body":"","categories":"","description":"","excerpt":"","ref":"/blog/news/","tags":"","title":"News"},{"body":"","categories":"","description":"Reference gxwuide definition and meaning.\n","excerpt":"Reference gxwuide definition and meaning.\n","ref":"/docs/reference-guide/","tags":"","title":"Reference Guide"},{"body":"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.\nDNS Service Discovery 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”.\n","categories":"","description":"The Communication Solution between Drycc Applicatios.","excerpt":"The Communication Solution between Drycc Applicatios.","ref":"/docs/applications/inter-app-communication/","tags":"","title":"Inter-app Communication"},{"body":" Managing Application Resource Limits 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 \u003crequests\u003e amount of resource for a process as well as limit the process from using more than \u003climits\u003e. By default, Kubernetes will set \u003crequests\u003e equal to \u003climit\u003e if we don’t explicitly set \u003crequests\u003e value. Please keep in mind that 0 \u003c= requests \u003c= limits.\nLimiting 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!\n$ 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 ","categories":"","description":"Drycc Workflow supports restricting memory and CPU shares of each process.","excerpt":"Drycc Workflow supports restricting memory and CPU shares of each …","ref":"/docs/applications/managing-resource-limits/","tags":"","title":"Resource Limits"},{"body":"You can use drycc domains to add or remove custom domains to the application:\n$ 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:\n$ 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).\nTo add or remove the application from the routing mesh, use drycc routing:\n$ 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:\n$ drycc routing:enable Enabling routing for finest-woodshed... done ","categories":"","description":"Make your apps accessible via custom domain names.","excerpt":"Make your apps accessible via custom domain names.","ref":"/docs/applications/domains-and-routing/","tags":"","title":"Domains and Routing"},{"body":"Application SSL Certificates 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.\nTo enable SSL on a custom domain, e.g., www.example.com, use the SSL endpoint.\n!!! 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).\nOverview 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:\nPurchase an SSL certificate from your SSL provider Upload the cert to Drycc Acquire SSL Certificate 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.\nDNS and Domain Configuration 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:\n$ drycc domains:add www.example.com --ptype==web -a foo Adding www.example.com to foo... done Add a Certificate Add your certificate, any intermediate certificates, and private key to the endpoint with the certs:add command.\n$ 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\nThe 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.\nThis allows for wildcard certificates and multiple domains in the SAN without uploading duplicates.\nAdd a Certificate Chain 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:\n$ cat server.crt server.ca \u003e server.bundle After that, you can add them to Drycc with the certs:add command:\n$ drycc certs:add example-com server.bundle server.key -a foo Adding SSL endpoint... done www.example.com Attach SSL certificate to a domain Certificates are not automagically connected up to domains, instead you will have to attach a certificate to a domain\n$ drycc certs:attach example-com example.com -a foo Each certificate can be connected to many domains. There is no need to upload duplicates.\nTo remove an association\n$ drycc certs:detach example-com example.com -a foo Endpoint overview You can verify the details of your domain’s SSL configuration with drycc certs.\n$ 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\n$ 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 Testing SSL Use a command line utility like curl to test that everything is configured correctly for your secure domain.\n!!! note The -k option flag tells curl to ignore untrusted certificates.\nPay 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.\nEnforcing SSL at the Router To enforce all HTTP requests be redirected to HTTPS, TLS can be enforced at the router level by running\n$ 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.\nTo disable enforced TLS, run\n$ drycc tls:force:disable -a foo Disabling https-only requests for foo... done Automated Certificate Management 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).\nTo enable ACM with the following command: $ drycc tls:auto:enable -a foo\nTo disable ACM with the following command: $ drycc tls:auto:disable -a foo\nRemove Certificate You can remove a certificate using the certs:remove command:\n$ drycc certs:remove my-cert -a foo Removing www.example.com... Done. Swapping out certificates 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.\nBe 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.\nAssuming all applications are already using example-com-2017 the following commands can be ran, chained together or otherwise:\n$ 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.\nTroubleshooting Here are some steps you can follow if your SSL endpoint is not working as you’d expect.\nUntrusted Certificate In some cases when accessing the SSL endpoint, it may list your certificate as untrusted.\nIf 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.\nIf 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.\n","categories":"","description":"SSL is a cryptographic protocol that provides end-to-end encryption and integrity for all web requests.","excerpt":"SSL is a cryptographic protocol that provides end-to-end encryption …","ref":"/docs/applications/ssl-certificates/","tags":"","title":"Application SSL Certificates"},{"body":"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\ndrycc.yaml Overview A manifest has three top-level sections.\nbuild – Specifies the to build Dockerfile run – Specifies the release phase tasks to execute deploy – Specifies process types and the commands to run for each type Here’s an example that illustrates using a manifest to build Docker images.\nbuild: 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.\n","categories":"","description":"Drycc Container Registry allows you to deploy your Docker-based app to Drycc. Both Common Runtime and Private Spaces are supported.","excerpt":"Drycc Container Registry allows you to deploy your Docker-based app to …","ref":"/docs/applications/using-dryccfile/","tags":"","title":"Using drycc.yaml"},{"body":" A Open, Unified, Lightweight, Simpler Containers as a Service (CaaS).\nWelcome to Drycc Drycc Workflow is an open source container cloud platform.\nUsually 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.\nDrycc 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.\nGetting Started To get started with Workflow, follow our Quick Start guide.\nTake a deep dive into Drycc Workflow in our Concepts, Architecture, and Components sections.\nFeel 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!\n","categories":"","description":"","excerpt":" A Open, Unified, Lightweight, Simpler Containers as a Service (CaaS). …","ref":"/docs/","tags":"","title":"Docs"},{"body":"","categories":"","description":"","excerpt":"","ref":"/blog/releases/","tags":"","title":"Release"},{"body":"Workflow ## v1.7.7 -\u003e v1.7.8 Releases builder v1.6.0 -\u003e v1.7.0 controller v1.8.0 -\u003e v1.9.0 workflow-cli v1.6.0 -\u003e v1.7.0 Features 384c7ee (builder) - domain: add procfile_type 26c8c7f (controller) - domain: add procfile_type bd49789 (workflow-cli) - domain: add procfile_type ","categories":"","description":"New Drycc Workflow Release v1.7.8","excerpt":"New Drycc Workflow Release v1.7.8","ref":"/blog/2024/05/01/drycc-workflow-v1.7.8/","tags":"","title":"Drycc Workflow v1.7.8"},{"body":"Workflow ## v1.7.6 -\u003e v1.7.7 Releases builder v1.5.1 -\u003e v1.6.0 controller v1.7.0 -\u003e v1.8.0 database v1.2.1 -\u003e v1.3.0 passport v1.2.0 -\u003e v1.3.0 imagebuilder v1.1.1 -\u003e v1.2.0 fluentbit v0.0.1 -\u003e v0.0.2 logger v1.3.3 -\u003e v1.3.4 storage v0.0.5 -\u003e v0.1.0 gateway v0.0.2 -\u003e v0.0.3 monitor v1.4.0 -\u003e v1.4.1 redis v1.3.2 -\u003e v1.4.0 timeseries v0.0.2 -\u003e v0.1.0 prometheus v0.1.1 -\u003e v0.1.2 rabbitmq v1.2.1 -\u003e v1.3.0 registry v1.2.2 -\u003e v1.3.0 registry-proxy v1.2.1 -\u003e v1.2.2 workflow-cli v1.5.2 -\u003e v1.6.0 Features 6c1cf5e (builder) - charts: reuses the value from an existing secret and config 65ae63c (builder) - pipeline: add dryccfile support bb7b11d (builder) - auth: add tokens api 39d022f (controller) - ps: add pod logs support 86056d0 (controller) - charts: reuses the value from an existing secret and config 4cf005c (controller) - limits: add limits plan support bf60e4b (controller) - controller: add init job 98f77a8 (controller) - pipeline: add dryccfile support 8ce9a83 (controller) - cert-manager: add tls events 7034f5d (controller) - config: deploy according to procfile_type 5554d8f (controller) - config: add typed_values 2c5bbad (controller) - auth: add token api 410d34e (database) - charts: reuses the value from an existing secret and config 693e4d1 (imagebuilder) - pipeline: add dryccfile support 7d9cc06 (imagebuilder) - config: add typed values 854e171 (passport) - charts: reuses the value from an existing secret and config 7ac9255 (passport) - oauth2: add authorization code for any grant type 4517547 (rabbitmq) - charts: reuses the value from an existing secret and config bccfcb4 (redis) - charts: reuses the value from an existing secret and config d887605 (registry) - charts: reuses the value from an existing secret and config ff09e5b (storage) - charts: reuses the value from an existing secret and config c6e2ac8 (timeseries) - charts: reuses the value from an existing secret and config 22c4c77 (workflow-cli) - apps: change drycc run to async a9e6369 (workflow-cli) - ps: add pod logs support 2bc31c8 (workflow-cli) - limits: add limits plan support f40398a (workflow-cli) - pipeline: add dryccfile support 03638ff (workflow-cli) - tls: add tls events 9113627 (workflow-cli) - config: add typed values 43ee760 (workflow-cli) - auth: add tokens api Fixes 50dfe64 (builder) - woodpecker: CI_SYSTEM_ARCH env removed ab09b24 (controller) - healthcheck: delete outdated code 52019b5 (controller) - services: default PORT change error f57ae42 (controller) - certificate: failed to create certificate 30c3f54 (controller) - woodpecker: CI_SYSTEM_ARCH env removed dbba43a (controller) - service: update port error e0459c5 (controller) - copy: use deepcopy replace copy 2122479 (controller) - charts: failed to call webhook 53d9977 (controller) - signals: config limits handle error afda287 (controller) - limits: always set default b350cb8 (database) - woodpecker: CI_SYSTEM_ARCH env removed b48a422 (fluentbit) - woodpecker: CI_SYSTEM_ARCH env removed 7cebca2 (gateway) - cert-manager: auto tls error 190c19b (imagebuilder) - woodpecker: CI_SYSTEM_ARCH env removed 2c6a6f9 (logger) - woodpecker: CI_SYSTEM_ARCH env removed 10bb98d (monitor) - woodpecker: CI_SYSTEM_ARCH env removed f8225dc (passport) - woodpecker: CI_SYSTEM_ARCH env removed 06db66c (prometheus) - woodpecker: CI_SYSTEM_ARCH env removed f4aff72 (rabbitmq) - woodpecker: CI_SYSTEM_ARCH env removed 88c18ff (redis) - woodpecker: CI_SYSTEM_ARCH env removed 5dcc19d (registry) - woodpecker: CI_SYSTEM_ARCH env removed 092a939 (registry-proxy) - woodpecker: CI_SYSTEM_ARCH env removed 3597ac9 (storage) - woodpecker: CI_SYSTEM_ARCH env removed 5a49b35 (timeseries) - woodpecker: CI_SYSTEM_ARCH env removed 0c4a48a (workflow-cli) - tls: change issuer options 06a2511 (workflow-cli) - tls: info error Maintenance 2f7617e (builder) - go: bump controller-sdk-go version aae2f29 (builder) - charts: add diagnostic mode 7304980 (builder) - woodpecker: migrations woodpecker-ci to 2 30b648b (builder) - charts: change canary app version 2afa006 (builder) - controller-sdk-go: bump version d127a90 (builder) - config: add typed values 32fdfd0 (controller) - charts: add diagnostic mode 0974942 (controller) - woodpecker: migrations woodpecker-ci to 2 f401e08 (controller) - python: bump python 3.12 c565959 (controller) - celery: remove retrieve_resource task 47be1a1 (controller) - requirements: bump drf 3.15.1 99f7468 (controller) - charts: add config to values.yaml 7d17f5c (controller) - scale: prohibit scale when there is a running pipeline f09e1c9 (controller) - resource: sort services and plans e817505 (controller) - limits: change default cpu and gpu name 5531b2f (controller) - auth: add password login 27473f7 (controller) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs c1ee1c7 (controller) - deps: bump aiohttp from 3.9.3 to 3.9.4 in /rootfs affbcb5 (database) - postgres: add patroni and postgres params (#15) f9e4eda (database) - dockerfile: install vi 008b7b6 (database) - dockerfile: install vim instand of vi dbbfee1 (database) - charts: add diagnostic mode 2e26c33 (database) - woodpecker: migrations woodpecker-ci to 2 a1b81f2 (database) - charts: change canary app version bc725e8 (fluentbit) - charts: add diagnostic mode 5d73886 (fluentbit) - woodpecker: migrations woodpecker-ci to 2 b85072d (fluentbit) - charts: change canary app version 761174d (gateway) - gateway: change secrets name 1c304da (gateway) - woodpecker: migrations woodpecker-ci to 2 b919a4c (gateway) - charts: change canary app version 3cea298 (imagebuilder) - charts: allow all dns 653bcbe (imagebuilder) - woodpecker: migrations woodpecker-ci to 2 59daeab (imagebuilder) - charts: change canary app version 2834a5a (logger) - charts: add diagnostic mode 6685492 (logger) - woodpecker: migrations woodpecker-ci to 2 191cdaf (logger) - charts: change canary app version b3c3cfa (monitor) - charts: add diagnostic mode 796799d (monitor) - grafana: add node metrics dashboard ef2a222 (monitor) - woodpecker: migrations woodpecker-ci to 2 9c83090 (monitor) - charts: change canary app version 1a97c2c (passport) - charts: add diagnostic mode 353e1ae (passport) - logger: add oauth2_provider logger config fe735c0 (passport) - woodpecker: migrations woodpecker-ci to 2 41d6144 (passport) - charts: change canary app version 979d474 (passport) - python: bump python 3.12 e9f41a1 (passport) - requirements: bump drf 3.15.1 f479f4d (passport) - charts: add migrate job ad9abf6 (passport) - passport: migrations add run_before 95ac667 (passport) - passport: optimize the use of master and slave database rules 204f7fc (passport) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs 90a6410 (prometheus) - woodpecker: migrations woodpecker-ci to 2 2d8eb44 (prometheus) - charts: change canary app version 9687a17 (rabbitmq) - charts: add diagnostic mode 35d3d5b (rabbitmq) - woodpecker: migrations woodpecker-ci to 2 6a6564d (rabbitmq) - charts: change canary app version cb6722f (redis) - charts: add diagnostic mode 9553497 (redis) - woodpecker: migrations woodpecker-ci to 2 1c8dc07 (redis) - charts: change canary app version 9fa2a32 (registry) - charts: add diagnostic mode 9b09e51 (registry) - woodpecker: migrations woodpecker-ci to 2 7dbd390 (registry) - charts: change canary app version e1d2a33 (registry-proxy) - charts: add diagnostic mode 3eabfdd (registry-proxy) - charts: remove default limits f8754da (registry-proxy) - woodpecker: migrations woodpecker-ci to 2 7df7316 (registry-proxy) - charts: change canary app version 861d3b8 (storage) - filer: modify the default parameters of the filer 5fa08da (storage) - woodpecker: migrations woodpecker-ci to 2 22c4620 (storage) - charts: change canary app version 6c1e29c (timeseries) - postgres: add patroni params e280d3f (timeseries) - dockerfile: install vi 5213617 (timeseries) - dockerfile: install vim instand of vi a569a57 (timeseries) - charts: add diagnostic mode b93ec70 (timeseries) - woodpecker: migrations woodpecker-ci to 2 ff3b870 (timeseries) - charts: change canary app version e334f74 (workflow-cli) - healthcheck: delete outdated healthcheck style 4f8b960 (workflow-cli) - auth: add password login ","categories":"","description":"New Drycc Workflow Release v1.7.7","excerpt":"New Drycc Workflow Release v1.7.7","ref":"/blog/2024/04/30/drycc-workflow-v1.7.7/","tags":"","title":"Drycc Workflow v1.7.7"},{"body":"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.\nWorkflow ## v1.7.4 -\u003e v1.7.5 Releases builder v1.5.0 -\u003e v1.5.1 controller v1.6.3 -\u003e v1.7.0 logger v1.3.2 -\u003e v1.3.3 storage v0.0.3 -\u003e v0.0.4 redis v1.3.1 -\u003e v1.3.2 rabbitmq v1.2.0 -\u003e v1.2.1 registry v1.2.1 -\u003e v1.2.2 workflow-cli v1.5.1 -\u003e v1.5.2 Features 95d130a (controller) - controller: volume support nfs Fixes ee2ee15 (controller) - controller: container entrypoint error 03ea4f8 (controller) - controller: class property have been deprecated in python 3.11 5f04d17 (controller) - controller: miss err msg 27972a3 (controller) - controller: load_db_state_to_k8s err a005d62 (controller) - controller: volume repeat path no error c7a5ba6 (rabbitmq) - rabbitmq: cpu usage to high 45c2077 (workflow-cli) - workflow-cli: miss err msg bc738bd (workflow-cli) - workflow-cli: volumes list format Maintenance 35e1c06 (builder) - builder: bump golang 1.22 26caa36 (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.10 e625c2f (logger) - logger: bump golang 1.22 bfa500d (redis) - redis: headless svc does not require ports 330209a (registry) - registry: headless svc does not require ports 48c42eb (storage) - storage: change volume index to leveldb f4fde9d (storage) - storage: add volume size limit 33e3684 (workflow-cli) - workflow-cli: volume support nfs 48d5950 (workflow-cli) - workflow-cli: bump golang 1.22 ","categories":"","description":"New Drycc Workflow Release v1.7.5","excerpt":"New Drycc Workflow Release v1.7.5","ref":"/blog/2024/02/27/drycc-workflow-v1.7.5/","tags":"","title":"Drycc Workflow v1.7.5"},{"body":"Workflow ## v1.7.5 -\u003e v1.7.6 Releases storage v0.0.4 -\u003e v0.0.5 Maintenance 6cb63b6 (storage) - seaweedfs: bump version 3.63 ","categories":"","description":"New Drycc Workflow Release v1.7.6","excerpt":"New Drycc Workflow Release v1.7.6","ref":"/blog/2024/02/27/drycc-workflow-v1.7.6/","tags":"","title":"Drycc Workflow v1.7.6"},{"body":"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.\nWorkflow ## v1.7.1 -\u003e v1.7.2 Releases controller v1.6.0 -\u003e v1.6.1 logger v1.3.1 -\u003e v1.3.2 storage v0.0.1 -\u003e v0.0.2 timeseries v0.0.1 -\u003e v0.0.2 prometheus v0.1.0 -\u003e v0.1.1 workflow-cli v1.5.0 -\u003e v1.5.1 Fixes 2fe80a6 (controller) - resources: after resources instance update, could not delete (#111) a4082ad (controller) - controller: resource status and binding e9bfccc (controller) - controller: fix multiple volumes mount at one dir error (#116) 58d2b4c (logger) - logger: redis conn error block 7cb2700 (prometheus) - prometheus: prometheus config basic_auth 7838c6b (storage) - storage: random accesskey secretkey d9dcdfb (storage) - storage: pod restart loses data 3cbdd29 (storage) - storage: tipd cannot start after deleting pod be7e11f (storage) - storage: jq command not found 878f674 (storage) - storage: charts updateStrategy error 06cfe56 (timeseries) - timeseries: the data node ip is incorrect Maintenance 7f29f5a (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 async dc6f45e (controller) - controller: add channel for pod exec af4f3a7 (controller) - controller: avoid error when secret no data field (#117) ca27956 (controller) - controller: add pod default security b2e9c64 (prometheus) - charts: node-exporter mount root (#2) 3cdb2b6 (storage) - storage: bump seaweedfs 3.61 00dd2fd (storage) - storage: add csi daemonset updateStrategy 48e763c (storage) - storage: add drycc storage upgrade document 841df90 (storage) - storage: bump seaweedfs 3.62 cefd52e (timeseries) - timeseries: add check data node exists ad1c46e (workflow-cli) - resources: resources instance add message 9f955c2 (workflow-cli) - workflow-cli: add short options cpu 65399ef (workflow-cli) - workflow-cli: add tty resize support ","categories":"","description":"New Drycc Workflow Release v1.7.2","excerpt":"New Drycc Workflow Release v1.7.2","ref":"/blog/2024/01/29/drycc-workflow-v1.7.2/","tags":"","title":"Drycc Workflow v1.7.2"},{"body":"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.\nWorkflow ## v1.6.0 -\u003e v1.7.0 Releases builder v1.4.0 -\u003e v1.5.0 controller v1.5.1 -\u003e v1.6.0 database v1.2.0 -\u003e v1.2.1 passport v1.1.0 -\u003e v1.2.0 imagebuilder v1.1.0 -\u003e v1.1.1 fluentbit v0.0.0 -\u003e v0.0.1 logger v1.3.0 -\u003e v1.3.1 storage v0.0.0 -\u003e v0.0.1 gateway v0.0.0 -\u003e v0.0.1 monitor v1.3.0 -\u003e v1.4.0 redis v1.3.0 -\u003e v1.3.1 timeseries v0.0.0 -\u003e v0.0.1 prometheus v0.0.0 -\u003e v0.1.0 rabbitmq v1.1.0 -\u003e v1.2.0 registry v1.2.0 -\u003e v1.2.1 registry-proxy v1.2.0 -\u003e v1.2.1 Features fcbebda (builder) - builder: use TCPRoute expose service d02bb5d (controller) - controller: support app dns policy config 9aa968e (controller) - controller: add svc type support 62e2d34 (controller) - controller: improve the services api 4393755 (controller) - controller: use gateway replace ingress 323045d (controller) - controller: add canary support 3f81c97 (controller) - gateways: add addresses field 4e64aa7 (controller) - gateways: add addresses field 02ad581 (monitor) - grafana: add pd tikv dashboard 2a9e2b0 (monitor) - monitor: add storage monitor 41d5057 (monitor) - grafana: data source change to prometheus ec035d1 (monitor) - monitor: usegateway replace ingress c694c98 (monitor) - grafana: add drycc storage seaweedfs dashboard 1e1fdc8 (passport) - passport: use gateway replace ingress ffdb408 (prometheus) - prometheus: use gateway replace ingress 04152b9 (rabbitmq) - rabbitmq: use gateway replace ingress Fixes 0499500 (builder) - builder: manifest error 642491d (builder) - builder: no build log 873d146 (controller) - controller: do not set entrypoint when no procfile d9028c5 (controller) - controller: pip8 error 3efcfb7 (controller) - controller: manifest error 18a3a1a (controller) - controller: miss service error 94f796c (controller) - controller: drycc run pod should not restart 80f3161 (controller) - controller: monitor query error b76f2c5 (controller) - controller: read websocket delay b6e068e (controller) - controller: metrics sql tpl, gateway pod should not restart, cleanup old rs, update monitor datatbase config ad9adc6 (controller) - controller: rabbitmq sharding err 6773907 (controller) - controller: default k8s pod annotaions ffcf1f9 (controller) - controller: under-indented for visual indent 3afd0cf (controller) - controller: charts env error 769bb8b (database) - database: manifest error 769bb8b (database) - database: label conflict error 6a321c5 (database) - database: link error 558feae (fluentbit) - fluentbit: build charts error 98d8a2a (gateway) - fixup 8b5dde1 (gateway) - gateway: secretName 702866d (gateway) - gateway: build status f55dac1 (imagebuilder) - imagebuilder: manifest error ac13b5f (imagebuilder) - imagebuilder: build svg 6b7bbc5 (logger) - logger: manifest error 0136b5c (monitor) - monitor: manifest error f03d975 (passport) - passport: DRYCC_GRAFANA_DOMAIN error b530ea8 (passport) - passport: manifest error be5a0a7 (passport) - passport: change passport 1596c7f (rabbitmq) - rabbitmq: manifest error 0dc4f6f (rabbitmq) - rabbitmq: images-shard error 43293ae (redis) - redis: manifest error ca13b7d (registry) - registry: manifest error ab5c793 (registry) - registry: garbage collect error ab0fabc (registry-proxy) - registry-proxy: manifest error dfc7236 (registry-proxy) - registry-proxy: daemon yaml format 42c03be (storage) - storage: seaweedfs csi error 453e41a (timeseries) - timeseries: could not register node Docs 5433c89 (gateway) - gateway: add prerequisites 2f0c5d8 (logger) - logger: change architecture Maintenance bdd02eb (builder) - builder: use dynamic clusterrole name 66b4b25 (builder) - builder: upgrade new controller-go-sdk 219d86f (builder) - builder: upgrade go.mod 91f2f14 (builder) - builder: use woodpecker replace drone 9abca16 (builder) - woodpecker: use woodpecker ci build status f43dd50 (builder) - deps: bump golang.org/x/net from 0.2.0 to 0.7.0 0384c69 (builder) - builder: add chart appVersion e3149b9 (builder) - builder: upgrade codename to bookworm d88ea1b (builder) - builder: add codename build-arg ba59030 (builder) - builder: upgrade go.mod 1114dd7 (builder) - builder: bump common 1.1.2 fe50b62 (builder) - builder: change drycc gateway listener name db3950c (builder) - builder: remove gateway route 5a508bb (builder) - builder: use podman replace docker bbb9029 (builder) - deps: bump golang.org/x/net from 0.12.0 to 0.17.0 f4e5d6c (builder) - builder: remove health url 9111c8f (builder) - builder: remove io/ioutil 1f36e3d (controller) - deps: bump django from 4.1.2 to 4.1.6 in /rootfs e4ab434 (controller) - controller: use woodpecker replace drone 9f0301e (controller) - deps: bump django from 4.1.6 to 4.1.7 in /rootfs 3932423 (controller) - woodpecker: use woodpecker ci build status ae8b6b4 (controller) - setting: support KUBERNETES_LIMITS env config c10b9bc (controller) - controller: using the api_version instead of hard coding e6908cd (controller) - controller: upgrade requirements b0eba0c (controller) - controller: add route rules serializer 2e4b6a4 (controller) - controller: add chart appVersion 7d32b55 (controller) - controller: upgrade to bookworm f2dc8dd (controller) - controller: add codename build-arg 5739b83 (controller) - controller: use timescaledb replace influxdb 53892cb (controller) - controller: add timeseries 0fe0eae (controller) - controller: upgrade requirements 18b2a91 (controller) - deps: bump aiohttp from 3.8.4 to 3.8.5 in /rootfs f50874a (controller) - controller: bump common 1.1.2 956cd08 (controller) - controller: change drycc gateway listener name 9ab3ead (controller) - controller: remove passport url check a24c7b0 (controller) - controller: remove gateway route f7e539a (controller) - controller: change celery priority ab77a52 (controller) - controller: use podman replace docker 8e27501 (controller) - controller: dynamic app storage class 385978b (controller) - controller: list_pods datetime format b20362c (controller) - deps: bump django from 4.2.3 to 4.2.7 in /rootfs e11ae1b (controller) - controller: add cluster migrate ca6e9df (controller) - controller: async mount 9a7fbfc (controller) - controller: remove FOSSA 3d55279 (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs d498a11 (controller) - controller: add measure loalancers 249a985 (controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfs b967f58 (controller) - deps: bump aiohttp from 3.8.6 to 3.9.0 in /rootfs (#107) 8ca9ed6 (controller) - controller: no longer restrict reserved domain 9ff6649 (database) - database: add init database configure 9b4cd26 (database) - database: use dynamic clusterrole name b59cde4 (database) - database: remove minio require 86462f8 (database) - database: use woodpecker replace drone 1e8555a (database) - database: add chart appVersion 1b762d5 (database) - database: upgrade codename to bookworm 9ffe1fd (database) - database: add codename build-arg 69466d7 (database) - database: add database extension beb4b62 (database) - database: bump common 1.1.2 67e2714 (database) - database: use podman replace docker 8f328f8 (fluentbit) - fluentbit: no limit buffer size for kube api fc0552c (fluentbit) - fluentbit: use podman replace docker 63a6cab (fluentbit) - fluentbit: change fluentbit match 220f81a (fluentbit) - fluentbit: run as no-root aec1393 (fluentbit) - fluentbit: change configmap name 1af4fd2 (fluentbit) - fluentbit: change default stream name bef90ad (gateway) - gateway: add route for gateway d523ddb (gateway) - gateway: change drycc gateway listener name d9137f4 (gateway) - gateway: add chart appVersion 0425dd4 (gateway) - gateway: add customListeners 3982b86 (imagebuilder) - imagebuilder: use woodpecker replace drone 3e4e7a3 (imagebuilder) - imagebuilder: add chart appVersion 8df6e8e (imagebuilder) - imagebuilder: upgrade stack version a5601f7 (imagebuilder) - imagebuilder: add drycc_app env 07465f8 (imagebuilder) - imagebuilder: upgrade to bookworm 00d22d2 (imagebuilder) - imagebuilder: add codename build-arg 0b7a24e (imagebuilder) - imagebuilder: upgrade podman/mc/caddy a7d8be8 (imagebuilder) - imagebuilder: use podman replace docker 6b2da83 (logger) - logger: use woodpecker replace drone 8245b25 (logger) - woodpecker: use woodpecker ci build status f811a74 (logger) - logger: add chart appVersion 413f6f6 (logger) - logger: upgrade codename to bookworm 2ac6b10 (logger) - logger: add codename build-arg 2581426 (logger) - logger: bump redis to v9 364b25a (logger) - logger: bump common 1.1.2 dc169a3 (logger) - logger: use fluentbit replace fluentd d855d91 (logger) - logger: use podman replace docker f767235 (monitor) - monitor: add off-cluster passport configure ab23936 (monitor) - monitor: use dynamic clusterrole name 47beee0 (monitor) - monitor: change tikv secret key af7703f (monitor) - grafana: remove panel when component off-cluster 1b870c2 (monitor) - monitor: use woodpecker replace drone 4a5f1f1 (monitor) - grafana: up ldap api_url config 143cabe (monitor) - monitor: add prometheus architecture diagram 93091c2 (monitor) - woodpecker: use woodpecker ci build status 0b7045a (monitor) - grafana: add dashboard kubernetes_deployment_metrics 2fb1839 (monitor) - woodpecker: pipeline config VERSION, when build container image e272416 (monitor) - monitor: add chart appVersion abc0e53 (monitor) - monitor: upgrade codename to bookworm 86cc01b (monitor) - monitor: add codename build-arg 1cd849f (monitor) - monitor: add postgresql outputs c3205c0 (monitor) - monitor: change default agent config 8c802c0 (monitor) - monitor: add timeseries database e9abc40 (monitor) - monitor: bump common 1.1.2 6af66cd (monitor) - monitor: change drycc gateway listener name d02d718 (monitor) - monitor: remove gateway route 3509c29 (monitor) - monitor: use podman replace docker ed7bfa2 (monitor) - monitor: optimize env PROMETHEUS_URL da89bef (passport) - passport: charts codereview 61c4a96 (passport) - passport: support init app config 9101006 (passport) - passport: add initApplications to charts 7dd7fa4 (passport) - passport: use woodpecker replace drone 4400199 (passport) - woodpecker: use woodpecker ci build status 6b2c546 (passport) - passport: change secret name to drycc-passport-auto-tls c8bd824 (passport) - passport: upgrade requirements aee5aef (passport) - passport: add chart appVersion 2d81953 (passport) - passport: upgrade codename to bookworm 9e66242 (passport) - passport: add codename build-arg 0fca998 (passport) - passport: upgrade requirements 3482528 (passport) - passport: bump common 1.1.2 0c5ec93 (passport) - passport: change drycc gateway listener name f7b8f53 (passport) - passport: remove gateway route baf69da (passport) - passport: use podman replace docker fcd45dd (passport) - passport: add cluster migrate da6d32a (prometheus) - prometheus: add prometheus-config 683de9e (prometheus) - prometheus: use podman replace docker 3323300 (prometheus) - prometheus: remove gateway route da1d356 (prometheus) - prometheus: change drycc gateway listener name 4e7a936 (prometheus) - prometheus: bump common 1.1.2 44c1c6f (prometheus) - prometheus: add codename build-arg d1f1dda (prometheus) - prometheus: upgrade codename to bookworm 0836fc1 (prometheus) - prometheus: add chart appVersion 9e13232 (prometheus) - prometheus: add LICENSE f53e14a (rabbitmq) - rabbitmq: remove auto user 0ec7277 (rabbitmq) - rabbitmq: use woodpecker replace drone f376a30 (rabbitmq) - woodpecker: use woodpecker ci build status 51405d8 (rabbitmq) - rabbitmq: add chart appVersion 463ca03 (rabbitmq) - rabbitmq: upgrade codename to bookworm 1978a71 (rabbitmq) - rabbitmq: add codename build-arg 139277f (rabbitmq) - rabbitmq: bump common 1.1.2 be49741 (rabbitmq) - rabbitmq: change drycc gateway listener name 6d22518 (rabbitmq) - rabbitmq: remove gateway route 0eb7833 (rabbitmq) - rabbitmq: add check shards 9211063 (rabbitmq) - rabbitmq: erlang vm tuning optimization 648a78d (rabbitmq) - rabbitmq: use podman replace docker 0b43a4d (rabbitmq) - rabbitmq: add x-random exchange ad1c4da (redis) - redis: use woodpecker replace drone 3f37f92 (redis) - redis: add chart appVersion e3bef7a (redis) - redis: upgrade codename to bookworm 4e806d4 (redis) - redis: add codename build-arg d5023be (redis) - redis: bump common 1.1.2 98f5d6f (redis) - redis: use podman replace docker 063f29e (registry) - registry: use woodpecker replace drone 17bf8ae (registry) - woodpecker: use woodpecker ci build status 7bbad15 (registry) - registry: add chart appVersion 279154f (registry) - registry: upgrade codename to bookworm 3e4ae84 (registry) - registry: add codename build-arg fa322d6 (registry) - registry: bump common 1.1.2 6c18fe0 (registry) - registry: use podman replace docker 0bc8472 (registry) - registry: remove health url 5dacd9f (registry) - registry: add wait-for-port check fdeefc3 (registry) - registry: use headless 08bf9f8 (registry) - registry: change registry port to 5000 40bcea2 (registry) - registry: add registry push test 871b8e7 (registry) - registry: add default env 7f3b3ac (registry) - registry: bump registry 2.8.3 569f15d (registry-proxy) - registry-proxy: use woodpecker replace drone cc33caf (registry-proxy) - woodpecker: use woodpecker ci build status 0002aab (registry-proxy) - registry-proxy: add chart appVersion 40af10b (registry-proxy) - registry-proxy: upgrade codename to bookworm c56b9df (registry-proxy) - registry-proxy: add codename build-arg 9d5bfe0 (registry-proxy) - registry-proxy: use podman replace docker e6a3350 (registry-proxy) - registry-proxy: change worker_processes to 1 726f39d (storage) - storage: add volume compactionMBps a5aa2d8 (storage) - storage: add threshold to vacuum and reclaim spaces e687d04 (storage) - storage: delete disk type in single disk case 75ee2e4 (storage) - storage: change datanode replicas to 4 c5fd7ba (storage) - storage: delete useless env b3826ea (storage) - storage: add ssd hdd dir 29881a0 (storage) - storage: add balance cronjob c5a0f51 (storage) - storage: add defaultReplication for seaweedfs master 543c7a2 (timeseries) - timeseries: use podman replace docker 5376024 (timeseries) - timeseries: update timeseries-service-replica 52e8520 (timeseries) - timeseries: bump common 1.1.2 f82657c (timeseries) - timeseries: add start script ","categories":"","description":"New Drycc Workflow Release v1.7.0","excerpt":"New Drycc Workflow Release v1.7.0","ref":"/blog/2023/12/08/drycc-workflow-v1.7.0/","tags":"","title":"Drycc Workflow v1.7.0"},{"body":"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.\nWorkflow ## v1.5.0 -\u003e v1.6.0 Releases builder v1.3.0 -\u003e v1.4.0 controller v1.4.0 -\u003e v1.5.0 passport v1.0.0 -\u003e v1.1.0 database v1.1.0 -\u003e v1.2.0 imagebuilder v1.0.1 -\u003e v1.1.0 fluentd v1.2.0 -\u003e v1.3.0 logger v1.2.0 -\u003e v1.3.0 storage v1.2.0 -\u003e v1.3.0 monitor v1.2.0 -\u003e v1.3.0 redis v1.2.0 -\u003e v1.3.0 influxdb v1.1.0 -\u003e v1.2.0 rabbitmq v1.0.0 -\u003e v1.1.0 registry v1.1.0 -\u003e v1.2.0 registry-proxy v1.1.0 -\u003e v1.2.0 Features 52517d9 (builder) - builder: update controller-sdk-go 1d78ca0 (builder) - builder: add affinity 26b6980 (builder) - builder: switch charts to oci bfd4385 (controller) - controller: add get manager user status 874208d (controller) - controller: unified measurement model cadf98f (controller) - controller: add admission webhook e0050c2 (controller) - controller: new measurement model a11ba58 (controller) - controller: multi pod restart uses async fb3c15d (controller) - controller: add check app owner status 3d78b76 (controller) - controller: add resource services api 3d6a201 (controller) - controller: add search apps api 01c443a (controller) - controller: add KUBERNETES_CPU_MEMORY_RATIO parameter 7c26232 (controller) - controller: add volume size limit 3bee749 (controller) - controller: add annotations support 23cd97c (controller) - controller: traefik v2 support e37b7db (controller) - controller: add affinity b3b367b (controller) - controller: add volume expand support a4e154a (controller) - controller: add database replica support 2f37216 (controller) - controller: switch wsgi to asgi b3314a5 (controller) - controller: add pod exec api 75df2dc (controller) - controller: add stream support for app logs 4229bad (controller) - ccontroller: switch charts to oci 89bb19b (database) - database: upgrade to pg14 9f45a5d (database) - database: add hugepages support c4008c9 (database) - database: add affinity 411a7b2 (database) - postgres: use patroni 64e5cb0 (database) - database: switch charts to oci 2bab823 (fluentd) - fluentd: switch charts to oci 337ba62 (imagebuilder) - imagebuilder: run podman as rootless 4396ffa (imagebuilder) - imagebuilder: switch to oci charts f37ae09 (influxdb) - influxdb: add affinity 04503b2 (influxdb) - influxdb: add influxdb ha 41ddad5 (influxdb) - influxdb: switch charts to oci 2006480 (logger) - logger: use redis stream replace nsqd ab23d17 (logger) - logger: add affinity 81d4e9d (logger) - logger: switch charts to oci c3d9796 (monitor) - monitor: add affinity cd9de3c (monitor) - monitor: switch to oci charts 318a73f (passport) - passport: add change user confirm 79ef100 (passport) - passport: add re login at authorize 6927bb5 (passport) - passport: add affinity 3146a09 (passport) - passport: add google reCAPTCHA 802abcd (passport) - passport: add replica database support a0dcd1b (passport) - passport: switch wsgi to asgi 4c9dbba (passport) - passport: switch charts to oci 74825f7 (rabbitmq) - rabbitmq: add rabbitmq managentment ingress 12cf7d6 (rabbitmq) - rabbitmq: add affinity 103417d (rabbitmq) - rabbitmq: switch charts to oci 5d428bb (redis) - redis: add affinity a88c1a9 (redis) - redis: switch charts to oci 541585d (registry) - registry: add affinity e9ca9d4 (registry) - registry: add garbage-collect cronjob ec62a59 (registry) - registry: switch charts to oci fde0b07 (registry-proxy) - registry-proxy: switch charts to oci be14eb4 (storage) - minio: add affinity 51af696 (storage) - storage: add k8s csi support 76a75d9 (storage) - storage: add cluster health checker a17dc8c (storage) - storage: switch charts to oci Fixes e4f44fb (builder) - builder: no error return e38dfc7 (builder) - builderControllerHost/ControllerPort init error ff9069f (controller) - controller: influxdb query error f7f5069 (controller) - controller: authentication 500 7e297a8 (controller) - controller: add check remote user status 9db28e1 (controller) - controller: celery MaxRetriesExceededError 4bcff08 (controller) - controller: wrong name d69fde2 (controller) - controller: traefik ingress create error a3ad743 (controller) - fixup(controller: user login error 662c8dd (controller) - controller: change influxdb port 957bdf6 (controller) - controller: validate rsa key pairing before storage 419ec4c (controller) - controller: kubernetes pod/exec cluster role a67edaa (controller) - controller: Cannot routing:disable e09e214 (controller) - controller: allowlist cannot remove 318b126 (controller) - controller: domains update error 92855eb (database) - database: premission denied bde945a (database) - fixup(postgres: support arm, fix Failed to build psutil 7854d45 (database) - fixup(postgres: user name converted to lowercase letters 57b2a07 (fluentd) - fluentd: ifconfig_path not found 20e72b9 (imagebuilder) - imagebuilder: upgrade pack version 651db8a (imagebuilder) - imagebuilder: chown uid gid order d2e9164 (influxdb) - influxdb: proxy not running 3a1d361 (monitor) - monitor: charts naming d754ae0 (monitor) - monitor: telegraf init error 63f9e34 (monitor) - monitor: affinity error 95ae1e5 (passport) - passport: yarn build fail 3f5365e (passport) - passport: wrong name 907f17b (passport) - passport: change uid gid to 1001 e3911e0 (passport) - passport: ‘registration_done’ not found 2ace5f0 (passport) - passport: ui style b3ba1e1 (passport) - passport privacy policy link 172e9c8 (passport) - passport: check databaseReplicaUrl error a3aeb70 (rabbitmq) - passport: change uid gid to 1001 5c73dcf (redis) - reids: DRYCC_REGISTY misspelling d7e3baf (redis) - redis: env miss cadaa91 (registry) - registry: set gid uid to 1001 d524217 (registry) - registry: storage run error 854f912 (registry) - registry: chown uid gid order e642bb7 (registry-proxy) - registry-proxy: containerPort error 8dfd029 (registry-proxy) - registry-proxy: chown uid gid order bbea364 (storage) - minio: premission denied 97deba1 (storage) - storage: node unimplemented error b9bdeff (storage) - storage: pd can not connect each other Style 1edb10c (controller) - controller: database convention over configuration 1960cc3 (database) - database: database name convention over configuration 06d1f5d (imagebuilder) - imagebuilder: URL to Url b8a8941 (passport) - passport: database convention over configuration Maintenance 8e9a199 (builder) - builder: upgrade controller-sdk-go 4840151 (builder) - builder: use exec runner replace docker runner 68ccfb1 (builder) - builder: canonical charts naming 8f971cb (builder) - builder: provide any additional service annotations fe2c55d (builder) - dockerfile: use drycc/base image 2b5e706 (builder) - dockerfile: change user and workdir 7a6c8d3 (builder) - builder: set gid uid to 1001 fe494f7 (builder) - dockerfile: use uid gid a7c8752 (builder) - builder: change nodes to pod affinity eb2e94c (builder) - database: bump mc 2022.04.01.23.44.48 cfaae66 (builder) - builder: use registry.drycc.cc replace docker.io d7d2890 (builder) - builder: change default imagebuilder registry ecfdb19 (builder) - imagebuilder: change python-dev registry 6da17f4 (builder) - builder: https://github.com/minio/minio/issues/14331 1a57e5b (builder) - builder: https://github.com/minio/minio/issues/14331 f1464fa (builder) - builder: https://github.com/minio/minio/issues/13799 b1e1c4f (builder) - builder: use env replace creds volume 71a4145 (builder) - builder: bump go.mod 3567688 (builder) - builder: fine management affinity 73ea38b (builder) - builder: change storage to minio 1f91321 (builder) - builder: use testify replace assert d148b9c (builder) - builder: add check storage health b768101 (builder) - builder: change initContainers 1b3bec3 (builder) - builder: add replicas 5cb0d61 (builder) - builder: upgrade to latest controller-sdk-go 98b9d58 (builder) - builder: upgrade new require 65817c3 (builder) - builder: change drycc.cc to www.drycc.cc 4e3f9d0 (controller) - controller: add celery retry mechanism f6716fe (controller) - controller: change cronjob name eb60693 (controller) - controller: refine celery task priority 66905e9 (controller) - controller: change manager auth ea20c41 (controller) - controller: remove start/stop api 4c8fc80 (controller) - controller: improve tasks error handling cf7402e (controller) - controller: add blocklist api 80f14dd (controller) - controller: use get_user_model replace auth.User ffc7bb7 (controller) - controller: use JSONField replace ArrayField 370df8c (controller) - controller: add validate metric 29084ce (controller) - controller: use user id request manager api 718fe12 (controller) - controller change urlpatterns order 71f4042 (controller) - controller: measurements uses lowercase letters e5123ea (controller) - controller: change resource unit to number 18fee9a (controller) - deps: bump celery from 5.1.2 to 5.2.2 in /rootfs ffca6c1 (controller) - controller: use exec runner replace docker runner 9ec12e1 (controller) - controller: simplify drone configuration 4b4749e (controller) - controller: set default CSRF_COOKIE_SECURE false 2ef6338 (controller) - deps: bump django from 3.2.5 to 3.2.10 in /rootfs c7570d0 (controller) - deps: bump django from 3.2.10 to 3.2.11 in /rootfs 8b17bc1 (controller) - controller: canonical charts naming c928fb0 (controller) - controller: use rabbitmq cluster f917185 (controller) - controller: provide any additional service annotations 22a8f63 (controller) - deps: bump django from 3.2.11 to 3.2.12 in /rootfs 3cc3b00 (controller) - dockerfile: use drycc/base image ee274f6 (controller) - controller: set venv profile ce6b069 (controller) - controller: set gid uid to 1001 3a105d3 (controller) - dockerfile: use uid gid 15f9b0e (controller) - controller: code review 01e6fd9 (controller) - controller: use passport user id 893ee31 (controller) - oauth2: update user info pipline 3028fb4 (controller) - user: set AnonymousUser username 5daf82d (controller) - controller: set worker_cancel_long_running_tasks_on_connection_loss 61f2c53 (controller) - controller: change nodes to pod affinity 88feb1d (controller) - imagebuilder: python=3.10.4 rabbitmq=3.9.14 914e03f (controller) - controller: use registry.drycc.cc replace docker.io a5bb548 (controller) - controller: change python-dev registry 3ecdd7c (controller) - controller: add a separate rabbitmqUrl configuration 967cb11 (controller) - controller: remove APP_STORAGE 473d2b5 (controller) - controller: use env replace creds volume e410d4c (controller) - deps: bump django from 3.2.12 to 3.2.13 in /rootfs c6ef777 (controller) - controller: simplified passport config 0fd3233 (controller) - controller: remove settings hardcode a64e99c (controller) - controller: change passport config 62aba25 (controller) - controller: set cronjob timezone to utc 760b70b (controller) - controller: change default ratio 8dffc3a (controller) - controller: fine management affinity 26043c4 (controller) - controller: change default app storage 608bd8d (controller) - deps: bump django from 3.2.13 to 3.2.14 in /rootfs 18ed0c2 (controller) - controller: remove conjob affinity add6712 (controller) - controller: add volume expand support use patch cc1ad13 (controller) - controller: add startupProbe 0e9a603 (controller) - controller: add clearsocial cronjob eb6f05d (controller) - controller: change initContainers 762c676 (controller) - controller: change replicas abd7e8c (controller) - deps: bump django from 3.2.14 to 3.2.15 in /rootfs 07fdf1b (controller) - controller: remove database conn_max_age ef8e41f (controller) - controller: add database replica check 79143f2 (controller) - controller: upgrade new require a624048 (controller) - controller: add app.refresh func annotation b22d367 (controller) - controller: optimize app refresh timing fe98f0c (database) - database: use exec runner replace docker runner 5e00c11 (database) - database: canonical charts naming d2cb860 (database) - database: disable huge_pages 197d80d (database) - database: add persistence 1c3e645 (database) - database: provide any additional service annotations 37730ab (database) - dockerfile: use drycc/base image 5014112 (database) - dockerfile: change entrypoint 29b538e (database) - database: change nodes to pod affinity c2bb074 (database) - database: bump python 3.10.4 and mc 2022.04.01.23.44.48 077a4e9 (database) - database: use registry.drycc.cc replace docker.io 560bdb9 (database) - database: change python-dev registry 1e54b55 (database) - database: https://github.com/minio/minio/issues/14331 d646672 (database) - database: https://github.com/minio/minio/issues/13799 a6ac4e3 (database) - database: use env replace creds volume 9618d87 (database) - database: fine management affinity b823273 (database) - database: change minio to storage 7bd5a90 (database) - database: add check storage health 20c6d96 (database) - database: fix storage run error 8bde830 (database) - database: upgrade to pg 14.5 a33b5e5 (fluentd) - fluentd: update plugins eed7a78 (fluentd) - fluentd: update filter kubernetes setting cc83dd8 (fluentd) - fluentd: update elasticsearch store setting and support exclude specific container logs ba2feb2 (fluentd) - fluentd: use exec runner replace docker runner d528676 (fluentd) - fluentd: simplify drone configuration dece82d (fluentd) - fluentd: canonical charts naming 4e0a802 (fluentd) - fluend: replace nsqd with redis 15ceca0 (fluentd) - dockerfile: use drycc/base image a7f619f (fluentd) - dockerfile: change workdir 9adf5ed (fluentd) - database: bump fluentd 1.14.6 50c14c2 (fluentd) - fluentd: use registry.drycc.cc replace docker.io 83171b1 (fluentd) - fluentd: change python-dev registry ec83581 (fluentd) - fluentd: unified reids declaration 07c63e2 (fluentd) - fluentd: upgrade fluentd 1.15.2 65df9be (imagebuilder) - imagebuilder: update pack version 66cab35 (imagebuilder) - imagebuilder: use dind replace go-dev 0c82060 (imagebuilder) - imagebuilder: use exec runner replace docker runner 8146da9 (imagebuilder) - imagebuilder: canonical charts naming 7d97241 (imagebuilder) - dockerfile: use drycc/base image 07e805c (imagebuilder) - imagebuilder: change default buildpack 8d1038d (imagebuilder) - imagebuilder: upgrade podman to 4.0.1 62d3687 (imagebuilder) - imagebuilder: change workdir to /workspace da8bfb0 (imagebuilder) - imagebuilder: change uid gid to 1001 d44e3bc (imagebuilder) - imagebuilder: upgrade stack 5b0c7e6 (imagebuilder) - imagebuilder: use registry.drycc.cc replace docker.io f74cbf6 (imagebuilder) - imagebuilder: add defaultBuildpacksURL 941d493 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/14331 449be91 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/13799 63b0523 (imagebuilder) - imagebuilder: use env replace creds volume 4e8a6e5 (imagebuilder) - imagebuilder: add imagebuilder config 2d891f5 (imagebuilder) - imagebuilder: change minio to storage addceda (imagebuilder) - imagebuilder: upgrade new require a6e569f (imagebuilder) - imagebuilder: pack_build add –env-file parameter 6191ff5 (influxdb) - influxdb: use exec runner replace docker runner dc3f8c7 (influxdb) - influxdb: canonical charts naming 6b5c819 (influxdb) - influxdb: new ingress style 68b381d (influxdb) - influxdb: provide any additional service annotations ea20eb8 (influxdb) - dockerfile: use drycc/base image 64c0a71 (influxdb) - influxdb: set gid uid to 1001 a709ca1 (influxdb) - influxdb: use DRYCC_UID DRYCC_GID env 740dff0 (influxdb) - influxdb: use common affinity template e035673 (influxdb) - influxdb: change nodes to pod affinity f1cefbd (influxdb) - influxdb: use registry.drycc.cc replace docker.io a00100e (influxdb) - influxdb: fine management affinity 9d165ef (influxdb) - influxdb: add probe bee7fff (influxdb) - influxdb: upgrade to influxdb 2.4.0 254914c (logger) - logger: use exec runner replace docker runner 8d91c68 (logger) - logger: canonical charts naming b6d2182 (logger) - logger: provide any additional service annotations c35e59a (logger) - dockerfile: use drycc/base image a63c070 (logger) - logger: change workdir to /workspace a594b28 (logger) - logger: set gid uid to 1001 9a90e22 (logger) - dockerfile: use uid gid 36493b4 (logger) - logger: use common affinity template 897a3a5 (logger) - logger: change nodes to pod affinity 03b32ab (logger) - logger: use registry.drycc.cc replace docker.io a50ba5f (logger) - logger: change python-dev registry 23187a3 (logger) - logger: unified reids declaration aaa129a (logger) - logger: fine management affinity be4f656 (logger) - logger: add replicas 7c25459 (logger) - charts: add NetworkPolicy 6810149 (logger) - logger: remove memory storage a918c50 (logger) - logger: add .vscode to .gitignore a415210 (logger) - logger: add log follow support 59b1da3 (logger) - logger: upgrade new require 27cc151 (monitor) - monitor: use exec runner replace docker runner 07d6a9d (monitor) - monitor: canonical charts naming 1054357 (monitor) - monitor: use redis default port e3673df (monitor) - monitor: remove nsqd fc9dd3e (monitor) - monitor: new ingress style 856a898 (monitor) - monitor: add default user env 9857535 (monitor) - monitor: add random user 38b5a04 (monitor) - grafana: oauth auto login 5dfc579 (monitor) - monitor: upgrade version e121b5a (monitor) - monitor: provide any additional service annotations 84462a0 (monitor) - dockerfile: use drycc/base image b9e8ce8 (monitor) - monitor: chore(imagebuilder): change uid gid to 1001 05ee8ab (monitor) - dockerfile: use uid gid e1fa68e (monitor) - monitor: use common affinity template b8f302b (monitor) - monitor: change nodes to pod affinity 4fc991f (monitor) - database: bump telegraf 1.22.0 and grafana 8.4.5 21a2f6a (monitor) - monitor: use registry.drycc.cc replace docker.io acc976f (monitor) - monitor: change python-dev registry 62d76c1 (monitor) - monitor: unified reids declaration b3c57ad (monitor) - monitor: optimize oauth2 configuration 70af6b0 (monitor) - monitor: change passport config 69f9a88 (monitor) - monitor: fine management affinity 2fb278f (monitor) - monitor: rename influxdb port 17548ff (monitor) - grafana: update dashborad 69d7bbd (monitor) - grafana: influx dashborad disk size 75db1b0 (monitor) - monitor: upgrade new grafana/telegraf 80504a1 (monitor) - grafana: update influx and redis dashboard f7078cb (monitor) - monitor:chown use env 91ae0dd (passport) - passport: optimize login display 2d3bbbc (passport) - passport: change drycc logo 59790a7 (passport) - passport: make user email unique faea034 (passport) - passport: use strtobool 1fbf2bc (passport) - passport: use yarn replace npm 119cac8 (passport) - passport: use exec runner replace docker runner cff5062 (passport) - passport: set default CSRF_COOKIE_SECURE false 9cc0210 (passport) - passport: canonical charts naming 9ab3896 (passport) - passport: new ingress style 259ccc9 (passport) - passport: provide any additional service annotations af1bbcd (passport) - dockerfile: use drycc/base image 9ae5373 (passport) - passport: set venv profile 8f61090 (passport) - dockerfile: use uid gid fcaf72d (passport) - passport: upgrade npm package 546dcd5 (passport) - passport: add license 4bda2d6 (passport) - passport: use minify 73b0fd1 (passport) - passport: use common affinity template 278fe7a (passport) - passport: change nodes to pod affinity 3cd93d3 (passport) - passport: add reactive 370b493 (passport) - passport: add footer 483cbd6 (passport) - passport: use h_captcha replace re_captcha 3d1675e (passport) - database: bump python 3.10.4 and node 16.14.2 86a7835 (passport) - passport: use registry.drycc.cc replace docker.io 2d65355 (passport) - passport: change python-dev registry 90c1444 (passport) - passport: unified reids declaration 2e0e417 (passport) - passport: fix firefox footer ad274be (passport) - passport: use bulecss f986d8b (passport) - passport: add main footer 3e52867 (passport) - passport: dynamic settings for vue 38adabc (passport) - passport: change passport config f8d6b60 (passport) - passport: fine management affinity 2cbd79d (passport) - passport: remove database conn_max_age 7122797 (passport) - passport: change drycc.cc to www.drycc.cc 8cc84cd (rabbitmq) - rabbitmq: use exec runner replace docker runner f35930f (rabbitmq) - rabbitmq: add rabbitmq cluster support fbfa3ba (rabbitmq) - rabbitmq: canonical charts naming ca60701 (rabbitmq) - rabbitmq: use volumeClaimTemplates fe5d1b4 (rabbitmq) - rabbitmq: add sharding support 9c4ab97 (rabbitmq) - rabbitmq: provide any additional service annotations 348a88a (rabbitmq) - dockerfile: use drycc/base image 2388be1 (rabbitmq) - rabbitmq: upgrade erlang to 24.2.2 db2eaa5 (rabbitmq) - dockerfile: use uid gid 772afd1 (rabbitmq) - rabbitmq: change to wait pid file 2bfc25e (rabbitmq) - rabbitmq: use common affinity template 11d505e (rabbitmq) - rabbitmq: change nodes to pod affinity 69d63f1 (rabbitmq) - database: bump erlang 24.3.3 and rabbitmq 3.9.14 8380299 (rabbitmq) - rabbitmq: use registry.drycc.cc replace docker.io b3f69f1 (rabbitmq) - rabbitmq: add check rabbitmqLocaltion 5327c76 (rabbitmq) - rabbitmq: fine management affinity 5c66b5a (rabbitmq) - rabbitmq: change probe 27bebf9 (rabbitmq) - rabbitmq: add start-rabbitmq script 86ee6a7 (rabbitmq) - rabbitmq: upgrade to rabbitmq 3.10.7 1f29683 (redis) - redis: use exec runner replace docker runner a5041fc (redis) - redis: canonical charts naming 64468c2 (redis) - redis: add redis persistence de5d753 (redis) - redis: provide any additional service annotations f644639 (redis) - dockerfile: use drycc/base image 98051d2 (redis) - redis: premission denied bcb548e (redis) - dockerfile: use uid gid 524aa41 (redis) - redis: use common affinity template 26c9466 (redis) - redis: change nodes to pod affinity b67d7a2 (redis) - redis: use registry.drycc.cc replace docker.io 839ec50 (redis) - redis: use env replace creds volume 237ca86 (redis) - redis: fine management affinity bdd968d (redis) - redis: upgrade neew require 8b2910f (registry) - registry: use exec runner replace docker runner eedbe78 (registry) - registry: canonical charts naming 0241615 (registry) - registry: provide any additional service annotations 9b58da4 (registry) - dockerfile: use drycc/base image ab6acb7 (registry) - registry: change workdir to /workspace f368bf7 (registry) - registry: use DRYCC_UID DRYCC_GID env f4b9041 (registry) - registry: use common affinity template c2e87ca (registry) - registry: change nodes to pod affinity feb6aba (registry) - database: bump mc 2022.04.01.23.44.48 956932b (registry) - rregistry: use registry.drycc.cc replace docker.io deda8d8 (registry) - registry: move registry-secret.yaml from workflow to registry f52c7bf (registry) - registry: change python-dev registry 007fe03 (registry) - registry: https://github.com/minio/minio/issues/14331 d620c6d (registry) - registry: https://github.com/minio/minio/issues/13799 85e6b73 (registry) - registry: use env replace creds volume 6a1155d (registry) - registry: fine management affinity 7b8ebae (registry) - registry: change minio to storage 1338951 (registry) - registry: add check storage health 2fa769d (registry) - registry: change probe f187cbf (registry) - registry: add replicas 09d8a7b (registry) - registry: upgrade to mc 2022.08.28.20.08.11 4b187b8 (registry-proxy) - registry-proxy: use exec runner replace docker runner 29ffbbe (registry-proxy) - registry-proxy: canonical charts naming 6d783ba (registry-proxy) - registry-proxy: remove use_cni 8cf05cf (registry-proxy) - dockerfile: use drycc/base image 090e286 (registry-proxy) - registry-proxy: chore(imagebuilder): change uid gid to 1001 7cf6120 (registry-proxy) - registry-proxy: use DRYCC_UID DRYCC_GID env 3a00697 (registry-proxy) - registry-proxy: use registry.drycc.cc replace docker.io 30e69e8 (registry-proxy) - registry-proxy: add registry basic auth proxy 942abce (registry-proxy) - registry-proxy: upgrade to nginx 1.23.1 5ea3297 (storage) - minio: use exec runner replace docker runner 8306add (storage) - minio: canonical charts naming c917e9f (storage) - minio: provide any additional service annotations 042c732 (storage) - dockerfile: use drycc/base image 7b47b82 (storage) - minio: change workdir to /workspace 6f3531e (storage) - minio: use DRYCC_UID DRYCC_GID env 9795fb1 (storage) - minio: use common affinity template a7b09c5 (storage) - minio: change nodes to pod affinity 7607342 (storage) - database: bump mc 2022.04.01.23.44.48 and minio 2022.04.01.03.41.39 ea2b2f1 (storage) - minio: use registry.drycc.cc replace docker.io 445b501 (storage) - minio: https://github.com/minio/minio/issues/14331 f19fbc7 (storage) - minio: use env replace creds volume 8982e2e (storage) - minio: use minio to distributed 06bec73 (storage) - minio: fine management affinity 9b8f006 (storage) - storage: remove assert 59d64b9 (storage) - storage: change listen to POD_IP 60044ee (storage) - storage: add juicefs mount options 189f944 (storage) - storage: remove volumeName 302fe89 (storage) - storage: mv to minio dir 6ec586d (storage) - storage: change readinessProbee andlivenessProbe 0e028df (storage) - storage: add minio pdb cf9bd2d (storage) - storage: add check storage health svc 2dd5c9f (storage) - storage: add volumeBindingMode fa2effc (storage) - storage: remove databaseBucket d166cc7 (storage) - charts: format network-policy name d06bcce (storage) - storage: upgrade to golang 1.19 c2ca05c (storage) - storage: upgrade new require ","categories":"","description":"New Drycc Workflow Release v1.6.0","excerpt":"New Drycc Workflow Release v1.6.0","ref":"/blog/2022/10/21/drycc-workflow-v1.6.0/","tags":"","title":"Drycc Workflow v1.6.0"},{"body":"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.\nWorkflow ## v1.4.0 -\u003e v1.5.0 Releases passport v1.0.0 rabbitmq v1.0.0 imagebuilder v1.0.0 builder v1.2.0 -\u003e v1.3.0 controller v1.3.0 -\u003e v1.4.0 database v1.0.2 -\u003e v1.1.0 fluentd v1.1.0 -\u003e v1.2.0 redis v1.1.0 -\u003e v1.2.0 influxdb v1.0.1 -\u003e v1.1.0 logger v1.1.0 -\u003e v1.2.0 minio v1.1.0 -\u003e v1.2.0 monitor v1.1.0 -\u003e v1.2.0 nsqd v1.1.0 -\u003e v1.2.0 registry v1.0.3 -\u003e v1.1.0 registry-proxy v1.0.2 -\u003e v1.1.0 Features 0f5f8e4 (builder) - builder: multi-platform support f269d06 (builder) - build: add buildx supportjkjkk:q 5e72fe8 (builder) - registry: use docker build 25d8a4c (builder) - docker: dealing with the change of docker in kubenetes 1.20 7a3e1c5 (builder) - charts: set the default chart version 46b75ff (builder) - builder: add cloud native buildpacks support 2db2054 (builder) - builder: unified build model 4b7f9d9 (builder) - builder: add initContainers b78c936 (controller) - token: add get token api bac52a5 (controller) - tasks: use celery replace nsqd b9b0c58 (controller) - build: add buildx support 205dcb3 (controller) - influxdb: add influxdb client ff15849 (controller) - influxdb: upgrade to influxdb 2.x 4016244 (controller) - controller: push data to influx fcfce2e (controller) - workflow-manager: add workflow-manager support 00e9bfb (controller) - influxdb: review influxdb code dd644d5 (controller) - docker: dealing with the change of docker in kubenetes 1.20 118278b (controller) - charts: set the default chart version 122a9cd (controller) - oauth2: add oauth2 support 559a5b6 (controller) - controller: use cncf buildpacks replace slugrunner 96130e6 (controller) - charts: database configuration optimization of passport and controller 2ea8508 (controller) - oauth: using passport authentication 868c437 (database) - database: multi-platform support eadd5da (database) - build: add buildx support b6eea4c (database) - docker: dealing with the change of docker in kubenetes 1.20 04a88db (database) - charts: set the default chart version 92ed309 (database) - database: add initContainer ee6b78f (fluentd) - build: add buildx support f523e30 (fluentd) - docker: dealing with the change of docker in kubenetes 1.20 ee47b53 (fluentd) - charts: set the default chart version 80a51af (influxdb) - influxdb: modify influxdb naming rules fb10030 (influxdb) - influxdb: use influxdb v2 0e87ad8 (influxdb) - docker: dealing with the change of docker in kubenetes 1.20 9d10801 (influxdb) - charts: set the default chart version d825c9f (logger) - build: add buildx support b139576 (logger) - docker: dealing with the change of docker in kubenetes 1.20 88f84ea (logger) - charts: set the default chart version 5ccae3e (logger) - dockerfile: remove chmod cmd 193aefc (logger) - logger: add initContainers baee330 (minio) - minio: multi-platform support ad5d055 (minio) - build: add buildx support 19868d4 (minio) - docker: dealing with the change of docker in kubenetes 1.20 4bd84b8 (minio) - charts: set the default chart version 79d1f2f (monitor) - database: multi-platform support 88e5a7f (monitor) - build: add buildx support 5672e99 (monitor) - influxdb: modify influxdb naming rules 8672103 (monitor) - influxdb: use influxdb v2 66cb4c8 (monitor) - docker: dealing with the change of docker in kubenetes 1.20 9576eb3 (monitor) - charts: set the default chart version 30809c9 (monitor) - monitor: add initContainers 70d140c (nsqd) - nsqd: using self compiled nsq binary 1073d4f (nsqd) - nsqd: use GOPATH replace /go e498480 (nsqd) - build: add buildx support cf9b7d5 (nsqd) - docker: dealing with the change of docker in kubenetes 1.20 c335856 (nsqd) - charts: set the default chart version efba713 (redis) - build: add buildx support c7a3b53 (redis) - docker: dealing with the change of docker in kubenetes 1.20 4cdad7b (redis) - charts: set the default chart version 652b443 (registry) - registry: multi-platform support 4060176 (registry) - registry: use docker build 7102a03 (registry) - docker: dealing with the change of docker in kubenetes 1.20 6c8600d (registry) - charts: set the default chart version 33a51c9 (registry) - registry: add initContainers bef70dc (registry-proxy) - build: add buildx support d2319c1 (registry-proxy) - docker: dealing with the change of docker in kubenetes 1.20 02fafed (registry-proxy) - charts: set the default chart version Fixes 5499c9a (controller) - gunicorn: gunicorn not running 06e9e88 (controller) - controller: error loading shared library 01b5bd0 (controller) - controller: upgrade celery config 6e32d55 (controller) - controller: fix update resources bug 0e0d53f (controller) - chart: set the domain depends certManagerEnabled 2ac4ca8 (controller) - passport: error loading shared library libexpat.so.1 a0dd517 (fluentd) - fluentd: drone build 6eca2a3 (logger) - logger: golang lint 63b0aa0 (registry) - drone: charts url error Docs 472cfcc (controller) - controller organize README.md document d9d6e29 (redis) - redis: delete links that do not exist Test case 1468f57 (controller) - controller: add command unittest Maintenance 9999bfd (builder) - builder:replace the special words cda8b58 (builder) - builder: remove docker keyword from charts dc575dd (builder) - builder: use imagebuilder replace dockerbuilder d3bb183 (builder) - docker: use the full name of registry 5fe34d1 (builder) - travis: add DEV_REGISTRY 7e36453 (builder) - CICD: use drone 52b8d9d (builder) - drone: add image_registries volumes 65963f4 (builder) - k8s: add privileged to dind d345fcf (builder) - LICENSE: revert modifications to Apache license 7975c99 (builder) - drone: always pull image 59633dd (builder) - builder: modify launch imagebuild pod 8d14e67 (builder) - builder: use Procfile in anywhere 5357fa8 (builder) - go: bump go mod 8d26ac0 (builder) - k8s: k8s deprecated api migration 0af620d (builder) - chars: change org to imageTag ae84303 (builder) - builder: run imagebuider replace pod with job 3b2c496 (builder) - builder: change docs website 5679a4c (builder) - builder: upgrade to golang1.17 a214503 (controller) - controller:replace whitelist with allowlist 375ddcc (controller) - ps:drycc ps:list show autoscale num c32e409 (controller) - ldap: canot register when ldap is enabled c46580a (controller) - controller:modify redis config fa9e87b (controller) - chart:modify controller charts 6f9fd08 (controller) - nsq: remove nsq 994b2dc (controller) - docker-buildx: add check-docker a720c3a (controller) - controller: remove docker keyword from charts e9a5c84 (controller) - docker: use the full name of registry a26614a (controller) - controller: add rabbitmq env 3df229d (controller) - controller: modify database config \u0026\u0026 remove redis port config \u0026\u0026 add env prefix with DRYCC 257e94b (controller) - controller: CELERY_BROKER use rabbitmq and modify celery-deployment cronjob f4d6ec3 (controller) - chart: pretty chart format 63e6195 (controller) - influxdb: modify influxdb code 0f6d408 (controller) - CICD: use drone 87bad28 (controller) - python: upgrade to python3.9 e8f7560 (controller) - volumes: modify mount summary 6cf6c6b (controller) - drone: add image_registries volumes a9397e8 (controller) - oauth: modify token Authentication c7f8c8b (controller) - deps: bump django from 2.2.14 to 2.2.18 in /rootfs a1a08aa (controller) - deps: bump djangorestframework from 3.11.0 to 3.11.2 in /rootfs efd78b4 (controller) - deps: bump django from 2.2.18 to 2.2.20 in /rootfs 649b044 (controller) - deps: bump django from 2.2.20 to 2.2.22 in /rootfs 41b742b (controller) - deps: bump django from 2.2.22 to 2.2.24 in /rootfs 22ffe5d (controller) - LICENSE: revert modifications to Apache license c98b468 (controller) - drone: always pull image 20e6edb (controller) - chart: modify the problem of using buildpack db16879 (controller) - controller: pretty pods list print ba6f456 (controller) - test: pretty pods list print 5fce4b7 (controller) - k8s: k8s deprecated api migration e9e0bcb (controller) - oauth: using passport authentication 0311172 (controller) - chars: change org to imageTag 150eff1 (controller) - charts: update cert-manager api version de8545a (controller) - controller: update requirements 1442207 (controller) - controller: using django native JSONFiled ab4e836 (controller) - oauth: modify passport api 5c54e06 (controller) - controller: eliminate pip warnings 870328d (controller) - controller: remove entrypoint 5e5e6ae (controller) - controller: upgrade celery config 607778f (controller) - controller: add initContainer 23dc016 (controller) - chart: set the domain depends certManagerEnabled f3cf20b (controller) - controller: remove default bash env 73f2636 (controller) - controller: modify alpinelinux repositories 498e9f2 (controller) - chart: change certManagerEnabled to boolean type 27f5308 (controller) - passport: exclude cryptography 370b75d (controller) - controller: use sh env 07585b4 (database) - postgres:replace the special words 20172dc (database) - database: remove docker keyword from charts abb9b88 (database) - docker: use the full name of registry e72f58f (database) - chart: modify the off-cluster database a91f64f (database) - travis: add DEV_REGISTRY 614fb76 (database) - tests: use add-host replace link a3428f3 (database) - CICD: use drone 239fef1 (database) - drone: add image_registries volumes 42858e1 (database) - LICENSE: revert modifications to Apache license d0fe850 (database) - drone: always pull image 34a36ad (database) - charts: Nn secret is generated during off-cluster 064ccf4 (database) - database: create database 9228992 (database) - chars: change org to imageTag 9f7810c (database) - database: upgrade to wal-g v1.1 05783f4 (fluentd) - fluentd:replace the special words 0739809 (fluentd) - influxdb:replace monitor-influx with influx f02487c (fluentd) - fluentd: remove docker keyword from charts 2c96cc0 (fluentd) - docker: use the full name of registry b20c429 (fluentd) - charts: remove port config 6dd0197 (fluentd) - travis: add DEV_REGISTRY c5bec51 (fluentd) - CICD: use drone f8524b7 (fluentd) - drone: add image_registries volumes a50878a (fluentd) - LICENSE: revert modifications to Apache license 14fe20e (fluentd) - drone: always pull image 4a2f660 (fluentd) - k8s: k8s deprecated api migration de2dd91 (fluentd) - chars: change org to imageTag a9f1944 (fluentd) - fluentd: upgrade to fluentd1.14 7cb4e95 (influxdb) - influxdb: change username to user 0fdc21b (influxdb) - influxdb: remove docker keyword from charts b2acddb (influxdb) - influxdb: change default path ba88919 (influxdb) - influxdb: add check_env function 9117401 (influxdb) - influxdb: modify init_influxdb has_bucket 092a3e6 (influxdb) - chart: pod not readiness 51de380 (influxdb) - travis: add DEV_REGISTRY 66d7667 (influxdb) - docker: replace influxdb base image 3aa3094 (influxdb) - CICD: use drone 14b9c24 (influxdb) - drone: add image_registries volumes 02b4cd1 (logger) - logger:replace the special words 114b5d5 (logger) - reids: delete the logger prefix of redis 639278a (logger) - redis: remove logger from redis conf 90195e2 (logger) - go: remove GOOS and GOARCH 31e2e27 (logger) - logger: remove docker keyword from charts 8fbd9fa (logger) - docker: use the full name of registry b39df2d (logger) - charts: remove redis\\nsqd port config 35d6d07 (logger) - travis: add DEV_REGISTRY 69aabf5 (logger) - tests: remove docker link e916644 (logger) - CICD: use drone d6872b7 (logger) - drone: add image_registries volumes 37801da (logger) - LICENSE: revert modifications to Apache license cfb4b38 (logger) - drone: always pull image 8bda3bf (logger) - go: bump go mod e13ebfc (logger) - chars: change org to imageTag 38e6d8d (minio) - minio:replace the special words d6925dd (minio) - minio: remove docker keyword from charts d56bc39 (minio) - docker: use the full name of registry e4696cc (minio) - travis: add DEV_REGISTRY 70c5c79 (minio) - minio: use latest version 773cf6c (minio) - Makefile: remove DEV_REGISTRY ?= 5ce5bc6 (minio) - CICD: use drone 5da8be3 (minio) - drone: add image_registries volumes c1f0611 (minio) - LICENSE: revert modifications to Apache license b73f792 (minio) - drone: always pull image 79d1c93 (minio) - go: bump go mod c448899 (minio) - chars: change org to imageTag 15ee49e (minio) - minio: migrate deprecated warning 9968a1a (minio) - minio: upgrade to golang1.7 14fedd2 (monitor) - monitor:replace the special works 52c431a (monitor) - reids: delete the logger prefix of redis 2c95b47 (monitor) - redis: remove logger from redis conf da9bc56 (monitor) - monitor:remove influxdb 53f47b9 (monitor) - grafana: use grafana docker image 5bdb188 (monitor) - grafana: use grafana docker image c0586dd (monitor) - monitor: remove docker keyword from charts 87d02b6 (monitor) - charts: add nodes and persistentvolumes rule 1b5598f (monitor) - monitor: modify grafana dashboard with FLUX and pretty config.toml bcbc0d5 (monitor) - docker: use the full name of registry 9418c9e (monitor) - monitor: fix upload dashboard error and modify INFLUXDB input 589f29a (monitor) - travis: add DEV_REGISTRY f776f8a (monitor) - CICD: use drone 6ca3060 (monitor) - drone: add image_registries volumes 6a9ffb2 (monitor) - LICENSE: revert modifications to Apache license 45e41ed (monitor) - drone: always pull image 654d407 (monitor) - k8s: k8s deprecated api migration 41e9b9c (monitor) - chars: change org to imageTag 99c10d3 (monitor) - charts: update cert-manager api version 9bf83c4 (monitor) - oauth: user oauth passport a128f6d (monitor) - chart: change certManagerEnabled to boolean type 8f897fe (monitor) - chart: set the domain depends certManagerEnabled ba6d793 (nsqd) - README:update travis build status 49879c4 (nsqd) - nsqd: minimum git clone code c5e2680 (nsqd) - nsqd: remove docker keyword from charts 21dd17b (nsqd) - docker: use the full name of registry 7d86b3c (nsqd) - charts: remove port config c073d95 (nsqd) - travis: add DEV_REGISTRY 55c297c (nsqd) - CICD: use drone 165c2ae (nsqd) - drone: add image_registries volumes 9c6a1f8 (nsqd) - LICENSE: revert modifications to Apache license 9283098 (nsqd) - drone: always pull image 46acf8a (nsqd) - k8s: k8s deprecated api migration 43caf80 (nsqd) - chars: change org to imageTag 6897471 (nsqd) - nsqd: use official image 297bc05 (redis) - redis:replace the special words f5f8b5e (redis) - reids: delete the logger prefix of redis af7b657 (redis) - redis: change logger-redis to redis 8dca154 (redis) - redis: remove logger from redis conf eaeda2d (redis) - redis: remove docker keyword from charts 53c6358 (redis) - docker: use the full name of registry ae37416 (redis) - charts: remove port config e985656 (redis) - travis: add DEV_REGISTRY 423336a (redis) - CICD: use drone be64ab4 (redis) - drone: add image_registries volumes 3bec735 (redis) - LICENSE: revert modifications to Apache license 4f934f6 (redis) - drone: always pull image 359b878 (redis) - chars: change org to imageTag 83b8ac2 (registry) - workflow:replace the special words 869b280 (registry) - registry: remove docker keyword from charts 999c1e9 (registry) - docker: use the full name of registry 5652da9 (registry) - travis: add DEV_REGISTRY cc8c6c2 (registry) - CICD: use drone c7bdbd0 (registry) - CICD: pretty .drone.yaml format 5c55a38 (registry) - test: use add-host replace link f8866f3 (registry) - drone: add image_registries volumes 6c8292f (registry) - LICENSE: revert modifications to Apache license 1d50f2c (registry) - drone: always pull image efbca6d (registry) - chars: change org to imageTag 2eafc59 (registry-proxy) - registry-proxy: update nginx 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions c72db96 (registry-proxy) - registry-proxy: change travis icon url 63ffb92 (registry-proxy) - registry-proxy:replace the special works 1d904a6 (registry-proxy) - registry-proxy: remove docker keyword from charts c8200b1 (registry-proxy) - docker: use the full name of registry d3fa939 (registry-proxy) - travis: add DEV_REGISTRY 5a8b353 (registry-proxy) - CICD: use drone 703d05a (registry-proxy) - drone: add image_registries volumes aa71db1 (registry-proxy) - LICENSE: revert modifications to Apache license 710c126 (registry-proxy) - drone: always pull image 2dcc5e6 (registry-proxy) - chars: change org to imageTag ","categories":"","description":"New Drycc Workflow Release v1.5.0","excerpt":"New Drycc Workflow Release v1.5.0","ref":"/blog/2022/10/06/drycc-workflow-v1.5.0/","tags":"","title":"Drycc Workflow v1.5.0"},{"body":"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.\nWorkflow ## v1.3.0 -\u003e v1.4.0 Releases builder v1.1.0 -\u003e v1.2.0 slugbuilder v1.1.1 -\u003e v1.2.0 dockerbuilder v1.1.1 -\u003e v1.1.2 controller v1.2.1 -\u003e v1.3.0 slugrunner v1.1.1 -\u003e v1.1.2 database v1.0.1 -\u003e v1.0.2 fluentd v1.0.1 -\u003e v1.1.0 redis v1.0.0 -\u003e v1.1.0 logger v1.0.0 -\u003e v1.1.0 minio v1.0.1 -\u003e v1.1.0 monitor v1.0.1 -\u003e v1.1.0 nsqd v1.0.0 -\u003e v1.1.0 registry v1.0.2 -\u003e v1.0.3 registry-proxy v1.0.0 -\u003e v1.0.1 Features fc7d93f (builder) - builder: use go-dev 0c2159e (builder) - builder: fmt code and add create_bucket script 1b88340 (controller) - controller: remove deprecated api a92fdeb (controller) - routable: ingress support routable 1e3eab3 (controller) - maintenance: add maintenance support for ingress 56b9dd0 (controller) - crt: support containerd-ctr 5fc3b46 (controller) - controller: add ephemeral-storage restriction d677e52 (controller) - controller: add a volume command 5f1323a (controller) - controller:drycc run cmd add –mount para 74c36a5 (controller) - tasks: add distributed async task 139c3ca (controller) - tasks: change nsq reader to async f237d74 (controller) - controller:add drycc resource cmd 41b46d0 (controller) - controller:add drycc resource cmd improvement c26f7d8 (controller) - controller: add LimitRanges support 45b5d1b (controller) - users: add users status api 4e16f9b (controller) - ps:add ps:stop/start command c659fa9 (controller) - k8s: add k8s cluster domain 31a625d (controller) - ps:add ps:stop/start command 00a779a (fluentd) - fluentd: support containerd log format f3f1bd4 (fluentd) - nsqd: add stateless nsqd cluster support db7147c (fluentd) - mirrors: delete aliyun mirrors 689c12e (logger) - nsqd: add stateless nsqd cluster support 78ccc5d (logger) - redis: add redis client cluster support 9843f2c (logger) - k8s: add k8s cluster domain 6ba122e (minio) - minio: add pvc support 6973550 (monitor) - monitor: add ingress for monitor cd73305 (monitor) - charts: add volumeName support 4769fe9 (monitor) - nsqd: add stateless nsqd cluster support 87806df (monitor) - k8s: add k8s cluster domain 4db40c4 (nsqd) - nsqd: add stateless nsqd cluster support b6f3d4f (nsqd) - nsqd: add stateless nsqd cluster support 74b85bb (redis) - redis: change redis to statefulset ff98b50 (slugbuilder) - slugbuilder: delete build hook b201c2f (slugbuilder) - buildpacks: use drycc buildpacks Fixes 0ec042d (builder) - test: fix test case error 4fb113b (builder) - build: base image replace by alpine 443df48 (builder) - minio: fix not bucket error 3dab5b0 (builder) - minio: create bucket error 734fca6 (controller) - autoscale: Fix for autoscale on k8s-1.9+ without breaking manual scaling a7dcd10 (controller) - controller: test pass 93f0f2e (controller) - controller: fix migrations error 4724375 (controller) - controller: fix test error 7bacf29 (controller) - charts: fix clusterrole 90957f7 (controller) - pod: sort events error 440b13e (controller) - controller: review table structure 0a470a6 (controller) - controller: bump tornado 5.1.1 e39218b (controller) - pynsq: no current event loop in thread 1d8630e (controller) - tests: fix test_task.py run error 1ff1202 (controller) - controller: fix test case d8c0da3 (controller) - settings: fix env name 6d8fd36 (database) - 003_restore_from_backup.sh: ignore script exit 1 e0394a9 (database) - minio: fix not bucket error f35f252 (database) - mc: fix create_bucket error 74d6886 (database) - postgres: recovery mode not run e50d0c1 (dockerbuilder) - caddy: fix caddy not start f3bec7a (fluentd) - influxdb: fix influxdb host and port bc19f27 (fluentd) - charts: skipped value for daemon_environment: Not a table 338d623 (logger) - logger: logger not run in alpine 7788302 (minio) - minio: bump minio version 619eed0 (minio) - fix: use go mod replace dep 3b42122 (monitor) - monitor: fix host error 67998ef (monitor) - influxdb: replace drycc-monitor-influxapi to drycc-monitor-influx-api 2cc361c (registry) - registry: fix test case 548297a (registry) - minio: fix not bucket error 5412ddb (registry) - minio: create bucket error d0d629e (slugbuilder) - slugbuilder:fix normalize_storage path d76ecbe (slugbuilder) - slugbuilder: use v3 api c505e18 (slugbuilder) - shellcheck: SC2039 Style c893a17 (builder) - builder: fmt code bba5795 (controller) - controller: format code d36082b (controller) - controller: fix pep8 66026f2 (controller) - resource: standardize the naming of resource 03d7e2c (controller) - servicecatalog: change servicecatalog to svcat 49dbb6d (controller) - controller: flake8 upgrade cbfc108 (monitor) - monitor: format charts and dashboard ee85954 (slugbuilder) - slugbuilder: use shellcheck 3afed2e (slugbuilder) - docker: simplify dockerfile 36b7f68 (slugrunner) - docker: simplify dockerfile Maintenance 61bb0ef (builder) - aws: upgrade aws sdk version 0f2e074 (builder) - chore: use go mode replace dep e9a2219 (builder) - builder: delete glide up bb8c518 (builder) - registry: del quay.io fa6d02f (builder) - builder: upgrade go.sum 9d61e8d (builder) - build: upgrade go.mod d763a98 (builder) - charts: upgrade k8s newer API versions d1bc1aa (builder) - pkg: upgrade to new drycc/pkg 02b1e98 (builder) - builder: update go mod 8e17d65 (builder) - builder: change alpine repositories f32b723 (builder) - mirrors: delete aliyun mirrors e33dc61 (builder) - minio: use bin mc replace docker images 3ab4f1c (builder) - builder: update controller-sdk-go b2adfac (builder) - heroku: remove heroku-16 support f429ac8 (builder) - builder: set GIT_LOCK_TIMEOUT to 30 minutes 7197c83 (builder) - go.mod:upgrade require pkg controller-sdk-go 5f3e22d (controller) - deps: bump django from 1.11.21 to 1.11.22 in /rootfs 1db645a (controller) - deps: bump django from 1.11.22 to 1.11.23 in /rootfs fbe8067 (controller) - deps: bump django from 1.11.23 to 1.11.29 in /rootfs 537d667 (controller) - registry: del quay.io a23c65b (controller) - deps: update all deps to the latest version 546337e (controller) - charts: upgrade k8s newer API versions 06023f8 (controller) - workflow-manager: del workflow-manager bba5736 (controller) - controller: change cluster-issuer location 6c43661 (controller) - Certificatechange cluster-issuer location 39a4728 (controller) - controller:change cluster-issuer location del controller-cluster-issuer.yaml 9e96d3f (controller) - Certificate:upgrade version cert-manager.io/v1alpha2 8e68049 (controller) - docker: use INDEX_URL replace index.docker.io 8fda205 (controller) - cert_manager: change cert_manager_enabled to global 6fefb6d (controller) - charts: change platform_domain to global 064b2ad (controller) - maintenance: remove maintenance support b8797c9 (controller) - workflow: remove namespace 1b20d76 (controller) - quota: add kube quota config d780075 (controller) - pod: add pod default resources support 3d72c08 (controller) - rename: rename ingress name 0aa6ab9 (controller) - mirrors: delete aliyun mirrors 7533a65 (controller) - heroku: remove heroku-16 support e5a885d (controller) - controller:check mount volume path 9014e74 (controller) - test: optimization Dockerfile.test 0b6ebb2 (controller) - tasks: change apply_async parameters 835f009 (controller) - wsgi: add tornado 6 support 67a4ad7 (controller) - utils: use threads replace asyncio a28949b (controller) - ldap: add AUTH_LDAP_USER_FLAGS_BY_GROUP a903209 (controller) - charts: add custom controller environment variables support e0e783e (controller) - ldap: change filter style d760825 (controller) - scheduler: remove debug log a25928e (controller) - wsgi: remove a wsgi.py file 7b2696e (controller) - log: disable nsq.client info log 8d5c07b (controller) - charts: add default environment 025f4a2 (controller) - controller: change quota name ebda60e (controller) - controller: review pvc code 8832ba9 (controller) - controller: change status\\binding model type and mount path check container_types 7148d04 (controller) - controller: add overcommit cpu and ram support 4d2087c (controller) - limits: modify limits unit verification af36970 (controller) - api: check cpu/memory range for api 329355b (controller) - volumes: modify the volume size 9dfee09 (controller) - LimitRanges: modify the default limits 5205bca (controller) - controller: improve the details of certificate 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z 6415e2c (database) - postgres: upgrade to pg13 12e6806 (database) - charts: upgrade k8s newer API versions d294509 (database) - minio: use canary minio test 1bad02e (database) - mirrors: delete aliyun mirrors d51420b (database) - minio: use bin mc replace docker images 4133d05 (dockerbuilder) - dockerbuilder: update caddy and kaniko 6b4dd18 (dockerbuilder) - minio: use bin mc replace docker images 6df9b7c (fluentd) - deps-dev: update rake requirement from ~\u003e 10.0 to ~\u003e 12.3 c2490f8 (fluentd) - fluentd: upgrade fluentd be4a56a (fluentd) - fluentd: add Gemfile.lock 2237f75 (fluentd) - charts: upgrade k8s newer API versions c574065 (fluentd) - charts: upgrade k8s newer API versions 52b8084 (fluentd) - router: delete obsolete router code 3b3cceb (fluentd) - fluentd: remove manifests dir 25c6702 (fluentd) - nsqd: change var name bd571be (fluentd) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS 72aa4e6 (fluentd) - influxdb: change influxdb service name bd61903 (logger) - logger: use go mod replace dep 69c63a1 (logger) - logger: update go.mod 3aa9cd7 (logger) - registry: del quay.io f058496 (logger) - nsqd: change var name 6d9787c (logger) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS 85ed307 (logger) - logger: standard naming d88e7b6 (minio) - minio: update minio api to v7 43715d2 (minio) - minio: upgrade minio 0e1239b (minio) - minio: use docker.io replace quay.io f7f047b (minio) - registry: del quay.io afa7128 (minio) - build: upgrade go.mod aff2db5 (minio) - charts: upgrade k8s newer API versions 4547f14 (minio) - pkg: upgrade to new drycc/pkg 2769b85 (minio) - minio: use bin mc replace docker images 35dde8d (monitor) - monitor: update grafana influxdb telegraf 9e3a949 (monitor) - charts: upgrade k8s newer API versions 6af0432 (monitor) - workflow-manager: remove workflow-manager 0611c07 (monitor) - router: delete obsolete router code be04824 (monitor) - cert_manager: change cert_manager_enabled to global 3780165 (monitor) - charts: change platform_domain to global 50b04e1 (monitor) - influxdb: remove influxdb admin ui 6ab4d68 (monitor) - influxdb: remove unuse port f1510bd (monitor) - monitor: update grafana dashboard,telegraf inputs.kubernetes f36de2c (monitor) - pvc: upgrade to new format fc78a0a (monitor) - workflow: remove namespace e85890f (monitor) - monitor: monitoring nsqd and redis separately 694f6b1 (monitor) - mirrors: delete aliyun mirrors 4aea36a (monitor) - grafana: add ldap support for grafana 68fc30f (nsqd) - nsq: update nsq 16f32aa (nsqd) - charts: upgrade k8s newer API versions 04db389 (redis) - reids: update to redis 6 3f01bab (redis) - charts: upgrade k8s newer API versions 647e4be (registry) - registry: del quay.io 0bbce99 (registry) - charts: upgrade k8s newer API versions a982b50 (registry) - minio: use bin mc replace docker images e088da3 (registry-proxy) - ingress: renmae use_native_ingress to use_ingress 7e88337 (registry-proxy) - nginx: upgrade nginx to mainline 7204d72 (registry-proxy) - registry: optimizing variable naming 2eafc59 (registry-proxy) - registry-proxy: update nginx 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions c72db96 (registry-proxy) - registry-proxy: change travis icon url ca9f962 (slugbuilder) - slugbuilder: del BUILDPACK_URL support 1b74dd5 (slugbuilder) - slugbuilder: add heroku-20 support 54d4ad2 (slugbuilder) - slugbuilder: del quay.io a78f37e (slugbuilder) - slugbuilder: add heroku-20 stack 94ac94a (slugbuilder) - minio: use bin mc replace docker images 53b4b8b (slugbuilder) - slugbuilder: modify stack priority 58e2bd2 (slugbuilder) - dockerfile: add WORKDIR /tmp b29cd04 (slugbuilder) - slugbuilder: add pre_build.sh 9d319f6 (slugbuilder) - slugbuilder: silent mc command output d1ec3c9 (slugbuilder) - heroku: remove heroku-16 support 5048534 (slugbuilder) - slugbuilder: use drycc stack-images a116537 (slugrunner) - slugrunner: add heroku-20 support a1196bf (slugrunner) - slugrunner: del quay.io 64c96d7 (slugrunner) - slugrunner: add heroku-20 stack cc3e226 (slugrunner) - minio: use bin mc replace docker images 9130bde (slugrunner) - shellcheck: shellcheck installer 4ea33e1 (slugrunner) - slugrunner: modify stack priority 5514e8b (slugrunner) - heroku: remove heroku-16 support be829fb (slugrunner) - slugrunner: use drycc stack-images e1e06be (slugrunner) - slugrunner: remove Dockerfile.heroku-16 ","categories":"","description":"New Drycc Workflow Release v1.4.0","excerpt":"New Drycc Workflow Release v1.4.0","ref":"/blog/2021/10/06/drycc-workflow-v1.4.0/","tags":"","title":"Drycc Workflow v1.4.0"},{"body":"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.\nWorkflow ## v1.2.0 -\u003e v1.3.0 Releases builder v1.0.2 -\u003e v1.1.0 slugbuilder v1.1.0 -\u003e v1.1.1 dockerbuilder v1.1.0 -\u003e v1.1.1 controller v1.2.0 -\u003e v1.2.1 slugrunner v1.1.0 -\u003e v1.1.1 database v1.0.0 -\u003e v1.0.1 fluentd v1.0.0 -\u003e v1.0.1 minio v1.0.0 -\u003e v1.0.1 monitor v1.0.0 -\u003e v1.0.1 registry v1.0.1 -\u003e v1.0.2 workflow-manager v1.0.0 -\u003e v1.0.1 Features 9c7cceb (builder) - builder: add app config to env Fixes 7fe44fa (controller) - docker: docker timeout must be an int, float or None b196550 (controller) - controller: revert release.check_image_access for now cc3ec13 (workflow-manager) - glide: bump goautoneg Maintenance ef932c4 (builder) - controller-sdk-go: upgrade controller-sdk-go 4654cf6 (controller) - django-rest-framework: upgrade to 3.9.3 14121f1 (controller) - deps: bump djangorestframework from 3.9.3 to 3.9.4 in /rootfs 385acdc (controller) - deps: bump django from 1.11.20 to 1.11.21 in /rootfs fa312bb (database) - postgres: set max_connections = 1024 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z b8878f6 (dockerbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z b097451 (fluentd) - fluent: upgrade fluent to v1.4 4341f9a (minio) - mc: upgrade mc and minio c1ee2a4 (monitor) - monitor: remove copyrights.tar.gz 9854260 (registry) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z acc5627 (slugbuilder) - slugbuilder: internal support for multi buildpack d58907e (slugbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z b39a0c2 (slugrunner) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z ","categories":"","description":"New Drycc Workflow Release v1.3.0","excerpt":"New Drycc Workflow Release v1.3.0","ref":"/blog/2020/10/06/drycc-workflow-v1.3.0/","tags":"","title":"Drycc Workflow v1.3.0"},{"body":"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.\nWorkflow ## v1.1.0 -\u003e v1.2.0 Releases builder v1.0.1 -\u003e v1.0.2 slugbuilder v1.0.0 -\u003e v1.1.0 dockerbuilder v1.0.0 -\u003e v1.1.0 controller v1.1.0 -\u003e v1.2.0 slugrunner v1.0.0 -\u003e v1.1.0 registry v1.0.0 -\u003e v1.0.1 registry-proxy v1.0.1 -\u003e v1.0.2 Features e5584e3 (controller) - controller: add STACK support ad34dc1 (dockerbuilder) - kaniko: use kaniko replace docker-py b81430e (dockerbuilder) - dockerbuilder: change image to image.json format 60dde96 (slugbuilder) - slugbuilder: add STACK support fe8b6e5 (slugrunner) - slugrunner: add STACK support Maintenance 942f050 (builder) - registry: remove env DRYCC_REGISTRY_PROXY_PORT ff7a16f (builder) - registry: remove ecr and gcr registry ad13683 (builder) - builder: change DRYCC_BUILD_TYPE to DRYCC_STACK 6def637 (builder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY 5044e22 (builder) - registry: remove registry_secret_prefix 2ea39cc (builder) - controller-go-sdk: upgrade controller-go-sdk 6aee0d7 (builder) - registry: optimizing variable naming f9c62d9 (controller) - domain: added reserved domain check f5a135b (controller) - migrations: clean old migrations 4369b2c (controller) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY 1057ca5 (controller) - registry: remove registry_secret_prefix d114b3e (controller) - docker: update docker client edbe963 (dockerbuilder) - dockerfile: change base image to alpine fb35baf (dockerbuilder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY 946dbf6 (dockerbuilder) - docker: remove insecure support 628d853 (dockerbuilder) - proxy: add registry proxy ff27cbd (registry) - env: remove unused env 7204d72 (registry-proxy) - registry: optimizing variable naming ","categories":"","description":"New Drycc Workflow Release v1.2.0","excerpt":"New Drycc Workflow Release v1.2.0","ref":"/blog/2019/10/06/drycc-workflow-v1.2.0/","tags":"","title":"Drycc Workflow v1.2.0"},{"body":"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.\nWe 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.\n","categories":"","description":"Drycc Workflow is A Open, Unified, Lightweight, Simpler Containers as a Service (CaaS).","excerpt":"Drycc Workflow is A Open, Unified, Lightweight, Simpler Containers as …","ref":"/blog/2018/10/06/welcome-to-drycc/","tags":"","title":"Welcome to Drycc"},{"body":" About Drycc Drycc, the only Container as a Service (CaaS) you need.\nNative 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.\nMission\nEmpower engineers and enterprises to innovate with speed, agility, and scale.\nVision\nBecome the best and most respected infrastructure software company in the world.\nCore values\nNative 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.\nWe value each other 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.\nWork for Customer Success 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.\nWe embrace failure We try things, break things, take risks, and believe failure is key to innovation. We bounce back from failure and learn quickly.\nWe are committed to open source 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.\nWe are committed to helping our customers build cool stuff that transforms their business in less time – we call it Time to Awesome.\n","categories":"","description":"","excerpt":" About Drycc Drycc, the only Container as a Service (CaaS) you need. …","ref":"/about/","tags":"","title":"About"},{"body":"This is the blog section. It has two categories: News and Releases.\nFiles in these directories will be listed in reverse chronological order.\n","categories":"","description":"","excerpt":"This is the blog section. It has two categories: News and Releases. …","ref":"/blog/","tags":"","title":"Blog"},{"body":"","categories":"","description":"","excerpt":"","ref":"/categories/","tags":"","title":"Categories"},{"body":" ","categories":"","description":"","excerpt":" ","ref":"/community/","tags":"","title":"Community"},{"body":" A Open, Unified, Lightweight, Simpler Containers as a Service (CaaS). Learn More Quickstart Simpler cloud, happier devs, better results — in the drycc!\nNative 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.\n(An easy-to-use, scalable CaaS platform available on Metal, AWS, Azure, and Google Cloud, and more)\nNew monitor metrics! We provide a few out of the box dashboards for monitoring Drycc Workflow.\nRead more\nContributions welcome! We do a Pull Request contributions workflow on GitHub. New users are always welcome!\nRead more\nContact us on tawk! If you have any questions concerning our products, our support team will be happy to help you.\nRead more\nFeatures\nOpen Source Open source from day one, leverage the power of global innovation with the leading database open source community.\nRead more\nMulti Platform Both X86 and ARM64 are supported with binaries and multiarch images available for both, drycc works great from something in any server.\nMeet twelve-factor Drycc Workflow is a lightweight CaaS platform that deploys and scales Twelve-Factor apps as containers across a K8s cluster.\nRead more\nIt’s easy to deploy, operate and scale drycc — anywhere.\n","categories":"","description":"","excerpt":" A Open, Unified, Lightweight, Simpler Containers as a Service (CaaS). …","ref":"/","tags":"","title":"Drycc"},{"body":"","categories":"","description":"","excerpt":"","ref":"/search/","tags":"","title":"Search Results"},{"body":"","categories":"","description":"","excerpt":"","ref":"/tags/","tags":"","title":"Tags"}] \ No newline at end of file diff --git a/robots.txt b/robots.txt new file mode 100644 index 000000000..4f9540ba3 --- /dev/null +++ b/robots.txt @@ -0,0 +1 @@ +User-agent: * \ No newline at end of file diff --git a/scss/main.min.3a5b24585fce93f20631bc122a4100bf83163d9bce2eabc28b44f9ef96cb84a0.css b/scss/main.min.3a5b24585fce93f20631bc122a4100bf83163d9bce2eabc28b44f9ef96cb84a0.css new file mode 100644 index 000000000..40c92866b --- /dev/null +++ b/scss/main.min.3a5b24585fce93f20631bc122a4100bf83163d9bce2eabc28b44f9ef96cb84a0.css @@ -0,0 +1,10 @@ +/*!* Bootstrap v5.2.3 (https://getbootstrap.com/) +* Copyright 2011-2022 The Bootstrap Authors +* Copyright 2011-2022 Twitter, Inc. +* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)*/@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,700,700i&display=swap";:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#081b4b;--bs-secondary:#fff;--bs-success:#3772ff;--bs-info:#c0e0de;--bs-warning:#ed6a5a;--bs-danger:#ed6a5a;--bs-light:#d3f3ee;--bs-dark:#403f4c;--bs-primary-rgb:8, 27, 75;--bs-secondary-rgb:255, 255, 255;--bs-success-rgb:55, 114, 255;--bs-info-rgb:192, 224, 222;--bs-warning-rgb:237, 106, 90;--bs-danger-rgb:237, 106, 90;--bs-light-rgb:211, 243, 238;--bs-dark-rgb:64, 63, 76;--bs-white-rgb:255, 255, 255;--bs-black-rgb:0, 0, 0;--bs-body-color-rgb:33, 37, 41;--bs-body-bg-rgb:255, 255, 255;--bs-font-sans-serif:"Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:Open Sans, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:#094db1;--bs-code-color:#999999;--bs-highlight-bg:#fff3cd}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,.td-footer__links-item,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media(min-width:1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + .9vw)}@media(min-width:1200px){h2,.h2{font-size:2rem}}h3,.h3,.td-footer__links-item{font-size:calc(1.275rem + .3vw)}@media(min-width:1200px){h3,.h3,.td-footer__links-item{font-size:1.5rem}}h4,.h4{font-size:calc(1.26rem + .12vw)}@media(min-width:1200px){h4,.h4{font-size:1.35rem}}h5,.h5{font-size:1.15rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small,.td-footer__center,.td-cover-block>.byline{font-size:.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--bs-link-color);text-decoration:underline}a:hover{color:var(--bs-link-hover-color)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media(min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled,.td-blog-posts-list{padding-left:0;list-style:none}.list-inline,.td-footer__links-list{padding-left:0;list-style:none}.list-inline-item,.td-footer__links-item{display:inline-block}.list-inline-item:not(:last-child),.td-footer__links-item:not(:last-child){margin-right:1rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid,.td-content img{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid var(--bs-border-color);border-radius:.375rem;box-shadow:0 .125rem .25rem rgba(0,0,0,.075);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media(min-width:576px){.container-sm,.container{max-width:540px}}@media(min-width:768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width:992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width:1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width:1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0}.row-cols-auto>*{flex:none;width:auto}.row-cols-1>*{flex:none;width:100%}.row-cols-2>*{flex:none;width:50%}.row-cols-3>*{flex:none;width:33.33333333%}.row-cols-4>*{flex:none;width:25%}.row-cols-5>*{flex:none;width:20%}.row-cols-6>*{flex:none;width:16.66666667%}.col-auto{flex:none;width:auto}.col-1{flex:none;width:8.33333333%}.col-2{flex:none;width:16.66666667%}.col-3{flex:none;width:25%}.col-4{flex:none;width:33.33333333%}.col-5{flex:none;width:41.66666667%}.col-6{flex:none;width:50%}.col-7{flex:none;width:58.33333333%}.col-8{flex:none;width:66.66666667%}.col-9{flex:none;width:75%}.col-10{flex:none;width:83.33333333%}.col-11{flex:none;width:91.66666667%}.col-12{flex:none;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media(min-width:576px){.col-sm{flex:1 0}.row-cols-sm-auto>*{flex:none;width:auto}.row-cols-sm-1>*{flex:none;width:100%}.row-cols-sm-2>*{flex:none;width:50%}.row-cols-sm-3>*{flex:none;width:33.33333333%}.row-cols-sm-4>*{flex:none;width:25%}.row-cols-sm-5>*{flex:none;width:20%}.row-cols-sm-6>*{flex:none;width:16.66666667%}.col-sm-auto{flex:none;width:auto}.col-sm-1{flex:none;width:8.33333333%}.col-sm-2{flex:none;width:16.66666667%}.col-sm-3{flex:none;width:25%}.col-sm-4{flex:none;width:33.33333333%}.col-sm-5{flex:none;width:41.66666667%}.col-sm-6{flex:none;width:50%}.col-sm-7{flex:none;width:58.33333333%}.col-sm-8{flex:none;width:66.66666667%}.col-sm-9{flex:none;width:75%}.col-sm-10{flex:none;width:83.33333333%}.col-sm-11{flex:none;width:91.66666667%}.col-sm-12{flex:none;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media(min-width:768px){.col-md{flex:1 0}.row-cols-md-auto>*{flex:none;width:auto}.row-cols-md-1>*{flex:none;width:100%}.row-cols-md-2>*{flex:none;width:50%}.row-cols-md-3>*{flex:none;width:33.33333333%}.row-cols-md-4>*{flex:none;width:25%}.row-cols-md-5>*{flex:none;width:20%}.row-cols-md-6>*{flex:none;width:16.66666667%}.col-md-auto{flex:none;width:auto}.col-md-1{flex:none;width:8.33333333%}.col-md-2{flex:none;width:16.66666667%}.col-md-3{flex:none;width:25%}.col-md-4{flex:none;width:33.33333333%}.col-md-5{flex:none;width:41.66666667%}.col-md-6{flex:none;width:50%}.col-md-7{flex:none;width:58.33333333%}.col-md-8{flex:none;width:66.66666667%}.col-md-9{flex:none;width:75%}.col-md-10{flex:none;width:83.33333333%}.col-md-11{flex:none;width:91.66666667%}.col-md-12{flex:none;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media(min-width:992px){.col-lg{flex:1 0}.row-cols-lg-auto>*{flex:none;width:auto}.row-cols-lg-1>*{flex:none;width:100%}.row-cols-lg-2>*{flex:none;width:50%}.row-cols-lg-3>*{flex:none;width:33.33333333%}.row-cols-lg-4>*{flex:none;width:25%}.row-cols-lg-5>*{flex:none;width:20%}.row-cols-lg-6>*{flex:none;width:16.66666667%}.col-lg-auto{flex:none;width:auto}.col-lg-1{flex:none;width:8.33333333%}.col-lg-2{flex:none;width:16.66666667%}.col-lg-3{flex:none;width:25%}.col-lg-4{flex:none;width:33.33333333%}.col-lg-5{flex:none;width:41.66666667%}.col-lg-6{flex:none;width:50%}.col-lg-7{flex:none;width:58.33333333%}.col-lg-8{flex:none;width:66.66666667%}.col-lg-9{flex:none;width:75%}.col-lg-10{flex:none;width:83.33333333%}.col-lg-11{flex:none;width:91.66666667%}.col-lg-12{flex:none;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media(min-width:1200px){.col-xl{flex:1 0}.row-cols-xl-auto>*{flex:none;width:auto}.row-cols-xl-1>*{flex:none;width:100%}.row-cols-xl-2>*{flex:none;width:50%}.row-cols-xl-3>*{flex:none;width:33.33333333%}.row-cols-xl-4>*{flex:none;width:25%}.row-cols-xl-5>*{flex:none;width:20%}.row-cols-xl-6>*{flex:none;width:16.66666667%}.col-xl-auto{flex:none;width:auto}.col-xl-1{flex:none;width:8.33333333%}.col-xl-2{flex:none;width:16.66666667%}.col-xl-3{flex:none;width:25%}.col-xl-4{flex:none;width:33.33333333%}.col-xl-5{flex:none;width:41.66666667%}.col-xl-6{flex:none;width:50%}.col-xl-7{flex:none;width:58.33333333%}.col-xl-8{flex:none;width:66.66666667%}.col-xl-9{flex:none;width:75%}.col-xl-10{flex:none;width:83.33333333%}.col-xl-11{flex:none;width:91.66666667%}.col-xl-12{flex:none;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media(min-width:1400px){.col-xxl{flex:1 0}.row-cols-xxl-auto>*{flex:none;width:auto}.row-cols-xxl-1>*{flex:none;width:100%}.row-cols-xxl-2>*{flex:none;width:50%}.row-cols-xxl-3>*{flex:none;width:33.33333333%}.row-cols-xxl-4>*{flex:none;width:25%}.row-cols-xxl-5>*{flex:none;width:20%}.row-cols-xxl-6>*{flex:none;width:16.66666667%}.col-xxl-auto{flex:none;width:auto}.col-xxl-1{flex:none;width:8.33333333%}.col-xxl-2{flex:none;width:16.66666667%}.col-xxl-3{flex:none;width:25%}.col-xxl-4{flex:none;width:33.33333333%}.col-xxl-5{flex:none;width:41.66666667%}.col-xxl-6{flex:none;width:50%}.col-xxl-7{flex:none;width:58.33333333%}.col-xxl-8{flex:none;width:66.66666667%}.col-xxl-9{flex:none;width:75%}.col-xxl-10{flex:none;width:83.33333333%}.col-xxl-11{flex:none;width:91.66666667%}.col-xxl-12{flex:none;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table,.td-table:not(.td-initial),.td-content table:not(.td-initial),.td-box table:not(.td-initial){--bs-table-color:var(--bs-body-color);--bs-table-bg:transparent;--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:var(--bs-table-color);vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*,.td-table:not(.td-initial)>:not(caption)>*>*,.td-content table:not(.td-initial)>:not(caption)>*>*,.td-box table:not(.td-initial)>:not(caption)>*>*{padding:.5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody,.td-table:not(.td-initial)>tbody,.td-content table:not(.td-initial)>tbody,.td-box table:not(.td-initial)>tbody{vertical-align:inherit}.table>thead,.td-table:not(.td-initial)>thead,.td-content table:not(.td-initial)>thead,.td-box table:not(.td-initial)>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*,.td-table:not(.td-initial)>tbody>tr:nth-of-type(odd)>*,.td-content table:not(.td-initial)>tbody>tr:nth-of-type(odd)>*,.td-box table:not(.td-initial)>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-color:#000;--bs-table-bg:#ced1db;--bs-table-border-color:#b9bcc5;--bs-table-striped-bg:#c4c7d0;--bs-table-striped-color:#000;--bs-table-active-bg:#b9bcc5;--bs-table-active-color:#000;--bs-table-hover-bg:#bfc1cb;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:white;--bs-table-border-color:#e6e6e6;--bs-table-striped-bg:#f2f2f2;--bs-table-striped-color:#000;--bs-table-active-bg:#e6e6e6;--bs-table-active-color:#000;--bs-table-hover-bg:#ececec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d7e3ff;--bs-table-border-color:#c2cce6;--bs-table-striped-bg:#ccd8f2;--bs-table-striped-color:#000;--bs-table-active-bg:#c2cce6;--bs-table-active-color:#000;--bs-table-hover-bg:#c7d2ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#f2f9f8;--bs-table-border-color:#dae0df;--bs-table-striped-bg:#e6edec;--bs-table-striped-color:#000;--bs-table-active-bg:#dae0df;--bs-table-active-color:#000;--bs-table-hover-bg:#e0e6e5;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fbe1de;--bs-table-border-color:#e2cbc8;--bs-table-striped-bg:#eed6d3;--bs-table-striped-color:#000;--bs-table-active-bg:#e2cbc8;--bs-table-active-color:#000;--bs-table-hover-bg:#e8d0cd;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#fbe1de;--bs-table-border-color:#e2cbc8;--bs-table-striped-bg:#eed6d3;--bs-table-striped-color:#000;--bs-table-active-bg:#e2cbc8;--bs-table-active-color:#000;--bs-table-hover-bg:#e8d0cd;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#d3f3ee;--bs-table-border-color:#bedbd6;--bs-table-striped-bg:#c8e7e2;--bs-table-striped-color:#000;--bs-table-active-bg:#bedbd6;--bs-table-active-color:#000;--bs-table-hover-bg:#c3e1dc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#403f4c;--bs-table-border-color:#53525e;--bs-table-striped-bg:#4a4955;--bs-table-striped-color:#fff;--bs-table-active-bg:#53525e;--bs-table-active-color:#fff;--bs-table-hover-bg:#4e4d59;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive,.td-table:not(.td-initial),.td-content table:not(.td-initial),.td-box table:not(.td-initial){overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.375rem;box-shadow:inset 0 1px 2px rgba(0,0,0,.075);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#848da5;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 0 .25rem rgba(8,27,75,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;background-image:var(--bs-gradient);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.25rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:calc(1.5em + .75rem + 2px);padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:.375rem}.form-control-color::-webkit-color-swatch{border-radius:.375rem}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + 2px)}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + 2px)}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.375rem;box-shadow:inset 0 1px 2px rgba(0,0,0,.075);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media(prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#848da5;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 0 .25rem rgba(8,27,75,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:.25rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:50%;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#848da5;outline:0;box-shadow:0 0 0 .25rem rgba(8,27,75,.25)}.form-check-input:checked{background-color:#081b4b;border-color:#081b4b}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"),var(--bs-gradient)}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"),var(--bs-gradient)}.form-check-input[type=checkbox]:indeterminate{background-color:#081b4b;border-color:#081b4b;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"),var(--bs-gradient)}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:0;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23848da5'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:100%;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"),var(--bs-gradient)}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check[disabled]+.btn,div.drawio .btn-check[disabled]+button,.td-blog .btn-check[disabled]+.td-rss-button,.btn-check:disabled+.btn,div.drawio .btn-check:disabled+button,.td-blog .btn-check:disabled+.td-rss-button{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(8,27,75,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(8,27,75,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#081b4b;background-image:var(--bs-gradient);border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media(prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b5bbc9;background-image:var(--bs-gradient)}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem;box-shadow:inset 0 1px 2px rgba(0,0,0,.075)}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#081b4b;background-image:var(--bs-gradient);border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media(prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b5bbc9;background-image:var(--bs-gradient)}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem;box-shadow:inset 0 1px 2px rgba(0,0,0,.075)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;width:100%;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder,.form-floating>.form-control-plaintext::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown),.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85)translateY(-.5rem)translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85)translateY(-.5rem)translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85)translateY(-.5rem)translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn,.input-group div.drawio button,div.drawio .input-group button,.input-group .td-blog .td-rss-button,.td-blog .input-group .td-rss-button{position:relative;z-index:2}.input-group .btn:focus,.input-group div.drawio button:focus,div.drawio .input-group button:focus,.input-group .td-blog .td-rss-button:focus,.td-blog .input-group .td-rss-button:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.375rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn,div.drawio .input-group-lg>button,.td-blog .input-group-lg>.td-rss-button{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn,div.drawio .input-group-sm>button,.td-blog .input-group-sm>.td-rss-button{padding:.25rem .5rem;font-size:.875rem;border-radius:.25rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#3772ff}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#000;background-color:rgba(55,114,255,.9);border-radius:.375rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3772ff;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233772ff' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem)center;background-size:calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#3772ff;box-shadow:0 0 0 .25rem rgba(55,114,255,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem)right calc(.375em + .1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#3772ff}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233772ff' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#3772ff;box-shadow:0 0 0 .25rem rgba(55,114,255,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + .75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#3772ff}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#3772ff}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(55,114,255,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3772ff}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#ed6a5a}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#000;background-color:rgba(237,106,90,.9);border-radius:.375rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ed6a5a;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ed6a5a'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ed6a5a' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem)center;background-size:calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ed6a5a;box-shadow:0 0 0 .25rem rgba(237,106,90,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem)right calc(.375em + .1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#ed6a5a}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23ed6a5a'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ed6a5a' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#ed6a5a;box-shadow:0 0 0 .25rem rgba(237,106,90,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + .75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#ed6a5a}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#ed6a5a}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(237,106,90,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ed6a5a}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn,div.drawio button,.td-blog .td-rss-button{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:#212529;--bs-btn-bg:transparent;--bs-btn-border-width:1px;--bs-btn-border-color:transparent;--bs-btn-border-radius:0.375rem;--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y)var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width)solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);background-image:var(--bs-gradient);box-shadow:var(--bs-btn-box-shadow);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.btn,div.drawio button,.td-blog .td-rss-button{transition:none}}.btn:hover,div.drawio button:hover,.td-blog .td-rss-button:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover,div.drawio .btn-check+button:hover,.td-blog .btn-check+.td-rss-button:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible,div.drawio button:focus-visible,.td-blog .td-rss-button:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);background-image:var(--bs-gradient);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-box-shadow),var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn,div.drawio .btn-check:focus-visible+button,.td-blog .btn-check:focus-visible+.td-rss-button{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-box-shadow),var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,div.drawio .btn-check:checked+button,.td-blog .btn-check:checked+.td-rss-button,:not(.btn-check)+.btn:active,div.drawio :not(.btn-check)+button:active,.td-blog :not(.btn-check)+.td-rss-button:active,.btn:first-child:active,div.drawio button:first-child:active,.td-blog .td-rss-button:first-child:active,.btn.active,div.drawio button.active,.td-blog .active.td-rss-button,.btn.show,div.drawio button.show,.td-blog .show.td-rss-button{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);background-image:none;border-color:var(--bs-btn-active-border-color);box-shadow:var(--bs-btn-active-shadow)}.btn-check:checked+.btn:focus-visible,div.drawio .btn-check:checked+button:focus-visible,.td-blog .btn-check:checked+.td-rss-button:focus-visible,:not(.btn-check)+.btn:active:focus-visible,div.drawio :not(.btn-check)+button:active:focus-visible,.td-blog :not(.btn-check)+.td-rss-button:active:focus-visible,.btn:first-child:active:focus-visible,div.drawio button:first-child:active:focus-visible,.td-blog .td-rss-button:first-child:active:focus-visible,.btn.active:focus-visible,div.drawio button.active:focus-visible,.td-blog .active.td-rss-button:focus-visible,.btn.show:focus-visible,div.drawio button.show:focus-visible,.td-blog .show.td-rss-button:focus-visible{box-shadow:var(--bs-btn-active-shadow),var(--bs-btn-focus-box-shadow)}.btn:disabled,div.drawio button:disabled,.td-blog .td-rss-button:disabled,.btn.disabled,div.drawio button.disabled,.td-blog .disabled.td-rss-button,fieldset:disabled .btn,fieldset:disabled div.drawio button,div.drawio fieldset:disabled button,fieldset:disabled .td-blog .td-rss-button,.td-blog fieldset:disabled .td-rss-button{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);background-image:none;border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity);box-shadow:none}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#081b4b;--bs-btn-border-color:#081b4b;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#071740;--bs-btn-hover-border-color:#06163c;--bs-btn-focus-shadow-rgb:45, 61, 102;--bs-btn-active-color:#fff;--bs-btn-active-bg:#06163c;--bs-btn-active-border-color:#061438;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#081b4b;--bs-btn-disabled-border-color:#081b4b}.btn-secondary{--bs-btn-color:#000;--bs-btn-bg:#fff;--bs-btn-border-color:#fff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:white;--bs-btn-hover-border-color:white;--bs-btn-focus-shadow-rgb:217, 217, 217;--bs-btn-active-color:#000;--bs-btn-active-bg:white;--bs-btn-active-border-color:white;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#fff;--bs-btn-disabled-border-color:#fff}.btn-success{--bs-btn-color:#000;--bs-btn-bg:#3772ff;--bs-btn-border-color:#3772ff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#5587ff;--bs-btn-hover-border-color:#4b80ff;--bs-btn-focus-shadow-rgb:47, 97, 217;--bs-btn-active-color:#000;--bs-btn-active-bg:#5f8eff;--bs-btn-active-border-color:#4b80ff;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#3772ff;--bs-btn-disabled-border-color:#3772ff}.btn-info,.td-blog .td-rss-button{--bs-btn-color:#000;--bs-btn-bg:#c0e0de;--bs-btn-border-color:#c0e0de;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#c9e5e3;--bs-btn-hover-border-color:#c6e3e1;--bs-btn-focus-shadow-rgb:163, 190, 189;--bs-btn-active-color:#000;--bs-btn-active-bg:#cde6e5;--bs-btn-active-border-color:#c6e3e1;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#c0e0de;--bs-btn-disabled-border-color:#c0e0de}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ed6a5a;--bs-btn-border-color:#ed6a5a;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f08073;--bs-btn-hover-border-color:#ef796b;--bs-btn-focus-shadow-rgb:201, 90, 77;--bs-btn-active-color:#000;--bs-btn-active-bg:#f1887b;--bs-btn-active-border-color:#ef796b;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ed6a5a;--bs-btn-disabled-border-color:#ed6a5a}.btn-danger{--bs-btn-color:#000;--bs-btn-bg:#ed6a5a;--bs-btn-border-color:#ed6a5a;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f08073;--bs-btn-hover-border-color:#ef796b;--bs-btn-focus-shadow-rgb:201, 90, 77;--bs-btn-active-color:#000;--bs-btn-active-bg:#f1887b;--bs-btn-active-border-color:#ef796b;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ed6a5a;--bs-btn-disabled-border-color:#ed6a5a}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#d3f3ee;--bs-btn-border-color:#d3f3ee;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#b3cfca;--bs-btn-hover-border-color:#a9c2be;--bs-btn-focus-shadow-rgb:179, 207, 202;--bs-btn-active-color:#000;--bs-btn-active-bg:#a9c2be;--bs-btn-active-border-color:#9eb6b3;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#d3f3ee;--bs-btn-disabled-border-color:#d3f3ee}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#403f4c;--bs-btn-border-color:#403f4c;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5d5c67;--bs-btn-hover-border-color:#53525e;--bs-btn-focus-shadow-rgb:93, 92, 103;--bs-btn-active-color:#fff;--bs-btn-active-bg:#666570;--bs-btn-active-border-color:#53525e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#403f4c;--bs-btn-disabled-border-color:#403f4c}.btn-outline-primary,div.drawio button{--bs-btn-color:#081b4b;--bs-btn-border-color:#081b4b;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#081b4b;--bs-btn-hover-border-color:#081b4b;--bs-btn-focus-shadow-rgb:8, 27, 75;--bs-btn-active-color:#fff;--bs-btn-active-bg:#081b4b;--bs-btn-active-border-color:#081b4b;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#081b4b;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#081b4b;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#fff;--bs-btn-border-color:#fff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#fff;--bs-btn-hover-border-color:#fff;--bs-btn-focus-shadow-rgb:255, 255, 255;--bs-btn-active-color:#000;--bs-btn-active-bg:#fff;--bs-btn-active-border-color:#fff;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#fff;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#3772ff;--bs-btn-border-color:#3772ff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#3772ff;--bs-btn-hover-border-color:#3772ff;--bs-btn-focus-shadow-rgb:55, 114, 255;--bs-btn-active-color:#000;--bs-btn-active-bg:#3772ff;--bs-btn-active-border-color:#3772ff;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#3772ff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#3772ff;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#c0e0de;--bs-btn-border-color:#c0e0de;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#c0e0de;--bs-btn-hover-border-color:#c0e0de;--bs-btn-focus-shadow-rgb:192, 224, 222;--bs-btn-active-color:#000;--bs-btn-active-bg:#c0e0de;--bs-btn-active-border-color:#c0e0de;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#c0e0de;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#c0e0de;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ed6a5a;--bs-btn-border-color:#ed6a5a;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ed6a5a;--bs-btn-hover-border-color:#ed6a5a;--bs-btn-focus-shadow-rgb:237, 106, 90;--bs-btn-active-color:#000;--bs-btn-active-bg:#ed6a5a;--bs-btn-active-border-color:#ed6a5a;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ed6a5a;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ed6a5a;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#ed6a5a;--bs-btn-border-color:#ed6a5a;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ed6a5a;--bs-btn-hover-border-color:#ed6a5a;--bs-btn-focus-shadow-rgb:237, 106, 90;--bs-btn-active-color:#000;--bs-btn-active-bg:#ed6a5a;--bs-btn-active-border-color:#ed6a5a;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ed6a5a;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ed6a5a;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#d3f3ee;--bs-btn-border-color:#d3f3ee;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3f3ee;--bs-btn-hover-border-color:#d3f3ee;--bs-btn-focus-shadow-rgb:211, 243, 238;--bs-btn-active-color:#000;--bs-btn-active-bg:#d3f3ee;--bs-btn-active-border-color:#d3f3ee;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#d3f3ee;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#d3f3ee;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#403f4c;--bs-btn-border-color:#403f4c;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#403f4c;--bs-btn-hover-border-color:#403f4c;--bs-btn-focus-shadow-rgb:64, 63, 76;--bs-btn-active-color:#fff;--bs-btn-active-bg:#403f4c;--bs-btn-active-border-color:#403f4c;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#403f4c;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#403f4c;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:none;--bs-btn-focus-shadow-rgb:45, 61, 102;text-decoration:underline;background-image:none}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.td-blog .td-rss-button,.btn-group-lg>.btn,div.drawio .btn-group-lg>button{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:0.5rem}.btn-sm,.btn-group-sm>.btn,div.drawio .btn-group-sm>button,.td-blog .btn-group-sm>.td-rss-button{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:0.25rem}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:#212529;--bs-dropdown-bg:#fff;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:0.375rem;--bs-dropdown-border-width:1px;--bs-dropdown-inner-border-radius:calc(0.375rem - 1px);--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color:#212529;--bs-dropdown-link-hover-color:#1e2125;--bs-dropdown-link-hover-bg:#e9ecef;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#081b4b;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y)var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width)solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius);box-shadow:var(--bs-dropdown-box-shadow)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y)0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y)var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg);background-image:var(--bs-gradient)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg);background-image:var(--bs-gradient)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent;background-image:none}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y)var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y)var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#081b4b;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,div.drawio .btn-group>button,.td-blog .btn-group>.td-rss-button,.btn-group-vertical>.btn,div.drawio .btn-group-vertical>button,.td-blog .btn-group-vertical>.td-rss-button{position:relative;flex:auto}.btn-group>.btn-check:checked+.btn,div.drawio .btn-group>.btn-check:checked+button,.td-blog .btn-group>.btn-check:checked+.td-rss-button,.btn-group>.btn-check:focus+.btn,div.drawio .btn-group>.btn-check:focus+button,.td-blog .btn-group>.btn-check:focus+.td-rss-button,.btn-group>.btn:hover,div.drawio .btn-group>button:hover,.td-blog .btn-group>.td-rss-button:hover,.btn-group>.btn:focus,div.drawio .btn-group>button:focus,.td-blog .btn-group>.td-rss-button:focus,.btn-group>.btn:active,div.drawio .btn-group>button:active,.td-blog .btn-group>.td-rss-button:active,.btn-group>.btn.active,div.drawio .btn-group>button.active,.td-blog .btn-group>.active.td-rss-button,.btn-group-vertical>.btn-check:checked+.btn,div.drawio .btn-group-vertical>.btn-check:checked+button,.td-blog .btn-group-vertical>.btn-check:checked+.td-rss-button,.btn-group-vertical>.btn-check:focus+.btn,div.drawio .btn-group-vertical>.btn-check:focus+button,.td-blog .btn-group-vertical>.btn-check:focus+.td-rss-button,.btn-group-vertical>.btn:hover,div.drawio .btn-group-vertical>button:hover,.td-blog .btn-group-vertical>.td-rss-button:hover,.btn-group-vertical>.btn:focus,div.drawio .btn-group-vertical>button:focus,.td-blog .btn-group-vertical>.td-rss-button:focus,.btn-group-vertical>.btn:active,div.drawio .btn-group-vertical>button:active,.td-blog .btn-group-vertical>.td-rss-button:active,.btn-group-vertical>.btn.active,div.drawio .btn-group-vertical>button.active,.td-blog .btn-group-vertical>.active.td-rss-button{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.375rem}.btn-group>:not(.btn-check:first-child)+.btn,div.drawio .btn-group>:not(.btn-check:first-child)+button,.td-blog .btn-group>:not(.btn-check:first-child)+.td-rss-button,.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),div.drawio .btn-group>button:not(:last-child):not(.dropdown-toggle),.td-blog .btn-group>.td-rss-button:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,div.drawio .btn-group>button.dropdown-toggle-split:first-child,.td-blog .btn-group>.dropdown-toggle-split.td-rss-button:first-child,.btn-group>.btn-group:not(:last-child)>.btn,div.drawio .btn-group>.btn-group:not(:last-child)>button,.td-blog .btn-group>.btn-group:not(:last-child)>.td-rss-button{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),div.drawio .btn-group>button:nth-child(n+3),.td-blog .btn-group>.td-rss-button:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,div.drawio .btn-group>:not(.btn-check)+button,.td-blog .btn-group>:not(.btn-check)+.td-rss-button,.btn-group>.btn-group:not(:first-child)>.btn,div.drawio .btn-group>.btn-group:not(:first-child)>button,.td-blog .btn-group>.btn-group:not(:first-child)>.td-rss-button{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split,div.drawio .btn-group-sm>button+.dropdown-toggle-split,.td-blog .btn-group-sm>.td-rss-button+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.td-blog .td-rss-button+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split,div.drawio .btn-group-lg>button+.dropdown-toggle-split,.td-blog .btn-group-lg>.td-rss-button+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group.show .dropdown-toggle{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,div.drawio .btn-group-vertical>button,.td-blog .btn-group-vertical>.td-rss-button,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),div.drawio .btn-group-vertical>button:not(:first-child),.td-blog .btn-group-vertical>.td-rss-button:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),div.drawio .btn-group-vertical>button:not(:last-child):not(.dropdown-toggle),.td-blog .btn-group-vertical>.td-rss-button:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn,div.drawio .btn-group-vertical>.btn-group:not(:last-child)>button,.td-blog .btn-group-vertical>.btn-group:not(:last-child)>.td-rss-button{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,div.drawio .btn-group-vertical>button~.btn,div.drawio .btn-group-vertical>.btn~button,div.drawio .btn-group-vertical>button~button,.td-blog .btn-group-vertical>.td-rss-button~.btn,.td-blog div.drawio .btn-group-vertical>.td-rss-button~button,div.drawio .td-blog .btn-group-vertical>.td-rss-button~button,.td-blog .btn-group-vertical>.btn~.td-rss-button,.td-blog div.drawio .btn-group-vertical>button~.td-rss-button,div.drawio .td-blog .btn-group-vertical>button~.td-rss-button,.td-blog .btn-group-vertical>.td-rss-button~.td-rss-button,.btn-group-vertical>.btn-group:not(:first-child)>.btn,div.drawio .btn-group-vertical>.btn-group:not(:first-child)>button,.td-blog .btn-group-vertical>.btn-group:not(:first-child)>.td-rss-button{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:#6c757d;display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y)var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link.disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:1px;--bs-nav-tabs-border-color:#dee2e6;--bs-nav-tabs-border-radius:0.375rem;--bs-nav-tabs-link-hover-border-color:#e9ecef #e9ecef #dee2e6;--bs-nav-tabs-link-active-color:#495057;--bs-nav-tabs-link-active-bg:#fff;--bs-nav-tabs-link-active-border-color:#dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width)solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));background:0 0;border:var(--bs-nav-tabs-border-width)solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:0.375rem;--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#081b4b}.nav-pills .nav-link{background:0 0;border:0;border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg);background-image:var(--bs-gradient)}.nav-fill>.nav-link,.nav-fill .nav-item{flex:auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar,.td-navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(0, 0, 0, 0.55);--bs-navbar-hover-color:rgba(0, 0, 0, 0.7);--bs-navbar-disabled-color:rgba(0, 0, 0, 0.3);--bs-navbar-active-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(0, 0, 0, 0.9);--bs-navbar-brand-hover-color:rgba(0, 0, 0, 0.9);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(0, 0, 0, 0.1);--bs-navbar-toggler-border-radius:0.375rem;--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y)var(--bs-navbar-padding-x);background-image:var(--bs-gradient)}.navbar>.container,.td-navbar>.container,.navbar>.container-fluid,.td-navbar>.container-fluid,.navbar>.container-sm,.td-navbar>.container-sm,.navbar>.container-md,.td-navbar>.container-md,.navbar>.container-lg,.td-navbar>.container-lg,.navbar>.container-xl,.td-navbar>.container-xl,.navbar>.container-xxl,.td-navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .show>.nav-link,.navbar-nav .nav-link.active{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y)var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width)solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:50%;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media(min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand,.td-navbar{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav,.td-navbar .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu,.td-navbar .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link,.td-navbar .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll,.td-navbar .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse,.td-navbar .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler,.td-navbar .navbar-toggler{display:none}.navbar-expand .offcanvas,.td-navbar .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand .offcanvas .offcanvas-header,.td-navbar .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body,.td-navbar .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark{--bs-navbar-color:rgba(255, 255, 255, 0.75);--bs-navbar-hover-color:rgba(255, 255, 255, 0.5);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card,.td-content .highlight{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-border-width:1px;--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(0.375rem - 1px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(0, 0, 0, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:#fff;--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width)solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius);box-shadow:var(--bs-card-box-shadow)}.card>hr,.td-content .highlight>hr{margin-right:0;margin-left:0}.card>.list-group,.td-content .highlight>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child,.td-content .highlight>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child,.td-content .highlight>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.td-content .highlight>.card-header+.list-group,.card>.list-group+.card-footer,.td-content .highlight>.list-group+.card-footer{border-top:0}.card-body{flex:auto;padding:var(--bs-card-spacer-y)var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y)var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width)solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius)var(--bs-card-inner-border-radius)0 0}.card-footer{padding:var(--bs-card-cap-padding-y)var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width)solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius)var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card,.td-content .card-group>.highlight{margin-bottom:var(--bs-card-group-margin)}@media(min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card,.td-content .card-group>.highlight{flex:1 0;margin-bottom:0}.card-group>.card+.card,.td-content .card-group>.highlight+.card,.td-content .card-group>.card+.highlight,.td-content .card-group>.highlight+.highlight{margin-left:0;border-left:0}.card-group>.card:not(:last-child),.td-content .card-group>.highlight:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.td-content .card-group>.highlight:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header,.td-content .card-group>.highlight:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.td-content .card-group>.highlight:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer,.td-content .card-group>.highlight:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child),.td-content .card-group>.highlight:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.td-content .card-group>.highlight:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header,.td-content .card-group>.highlight:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.td-content .card-group>.highlight:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer,.td-content .card-group>.highlight:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:#212529;--bs-accordion-bg:#fff;--bs-accordion-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:1px;--bs-accordion-border-radius:0.375rem;--bs-accordion-inner-border-radius:calc(0.375rem - 1px);--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:#212529;--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23071844'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#848da5;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(8, 27, 75, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:#071844;--bs-accordion-active-bg:#e6e8ed}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y)var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width))0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width)solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y)var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:#6c757d;--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:#6c757d;display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y)var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider,"/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:#6c757d;--bs-pagination-bg:#fff;--bs-pagination-border-width:1px;--bs-pagination-border-color:#dee2e6;--bs-pagination-border-radius:0.375rem;--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:#e9ecef;--bs-pagination-hover-border-color:#dee2e6;--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:#e9ecef;--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(8, 27, 75, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#081b4b;--bs-pagination-active-border-color:#081b4b;--bs-pagination-disabled-color:#dee2e6;--bs-pagination-disabled-bg:#fff;--bs-pagination-disabled-border-color:#dee2e6;display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y)var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width)solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);background-image:var(--bs-gradient);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:0.5rem}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:0.25rem}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:0.375rem;display:inline-block;padding:var(--bs-badge-padding-y)var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius);background-image:var(--bs-gradient)}.badge:empty{display:none}.btn .badge,div.drawio button .badge,.td-blog .td-rss-button .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:1px solid var(--bs-alert-border-color);--bs-alert-border-radius:0.375rem;position:relative;padding:var(--bs-alert-padding-y)var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:#05102d;--bs-alert-bg:#ced1db;--bs-alert-border-color:#b5bbc9;background-image:var(--bs-gradient)}.alert-primary .alert-link{color:#040d24}.alert-secondary{--bs-alert-color:#666666;--bs-alert-bg:white;--bs-alert-border-color:white;background-image:var(--bs-gradient)}.alert-secondary .alert-link{color:#525252}.alert-success{--bs-alert-color:#214499;--bs-alert-bg:#d7e3ff;--bs-alert-border-color:#c3d5ff;background-image:var(--bs-gradient)}.alert-success .alert-link{color:#1a367a}.alert-info{--bs-alert-color:#4d5a59;--bs-alert-bg:#f2f9f8;--bs-alert-border-color:#ecf6f5;background-image:var(--bs-gradient)}.alert-info .alert-link{color:#3e4847}.alert-warning{--bs-alert-color:#8e4036;--bs-alert-bg:#fbe1de;--bs-alert-border-color:#fad2ce;background-image:var(--bs-gradient)}.alert-warning .alert-link{color:#72332b}.alert-danger{--bs-alert-color:#8e4036;--bs-alert-bg:#fbe1de;--bs-alert-border-color:#fad2ce;background-image:var(--bs-gradient)}.alert-danger .alert-link{color:#72332b}.alert-light{--bs-alert-color:#54615f;--bs-alert-bg:#f6fdfc;--bs-alert-border-color:#f2fbfa;background-image:var(--bs-gradient)}.alert-light .alert-link{color:#434e4c}.alert-dark{--bs-alert-color:#26262e;--bs-alert-bg:#d9d9db;--bs-alert-border-color:#c6c5c9;background-image:var(--bs-gradient)}.alert-dark .alert-link{color:#1e1e25}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:#e9ecef;--bs-progress-border-radius:0.375rem;--bs-progress-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#081b4b;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius);box-shadow:var(--bs-progress-box-shadow)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height)var(--bs-progress-height)}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:#212529;--bs-list-group-bg:#fff;--bs-list-group-border-color:rgba(0, 0, 0, 0.125);--bs-list-group-border-width:1px;--bs-list-group-border-radius:0.375rem;--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:#495057;--bs-list-group-action-hover-color:#495057;--bs-list-group-action-hover-bg:#f8f9fa;--bs-list-group-action-active-color:#212529;--bs-list-group-action-active-bg:#e9ecef;--bs-list-group-disabled-color:#6c757d;--bs-list-group-disabled-bg:#fff;--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#081b4b;--bs-list-group-active-border-color:#081b4b;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section,".")". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y)var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width)solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#05102d;background-color:#ced1db}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#05102d;background-color:#b9bcc5}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#05102d;border-color:#05102d}.list-group-item-secondary{color:#666;background-color:#fff}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#666;background-color:#e6e6e6}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#666;border-color:#666}.list-group-item-success{color:#214499;background-color:#d7e3ff}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#214499;background-color:#c2cce6}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#214499;border-color:#214499}.list-group-item-info{color:#4d5a59;background-color:#f2f9f8}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#4d5a59;background-color:#dae0df}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#4d5a59;border-color:#4d5a59}.list-group-item-warning{color:#8e4036;background-color:#fbe1de}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#8e4036;background-color:#e2cbc8}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#8e4036;border-color:#8e4036}.list-group-item-danger{color:#8e4036;background-color:#fbe1de}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#8e4036;background-color:#e2cbc8}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#8e4036;border-color:#8e4036}.list-group-item-light{color:#54615f;background-color:#f6fdfc}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#54615f;background-color:#dde4e3}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#54615f;border-color:#54615f}.list-group-item-dark{color:#26262e;background-color:#d9d9db}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#26262e;background-color:#c3c3c5}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#26262e;border-color:#26262e}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em;color:#000;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e")50%/1em no-repeat;border:0;border-radius:.375rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(8,27,75,.25);opacity:1}.btn-close:disabled,.btn-close.disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1)grayscale(100%)brightness(200%)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(255, 255, 255, 0.85);--bs-toast-border-width:1px;--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:0.375rem;--bs-toast-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color:#6c757d;--bs-toast-header-bg:rgba(255, 255, 255, 0.85);--bs-toast-header-border-color:rgba(0, 0, 0, 0.05);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width)solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y)var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width)solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:#fff;--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:1px;--bs-modal-border-radius:0.5rem;--bs-modal-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius:calc(0.5rem - 1px);--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:1px;--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media(prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width)solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);box-shadow:var(--bs-modal-box-shadow);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width)solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y))calc(-.5 * var(--bs-modal-header-padding-x))calc(-.5 * var(--bs-modal-header-padding-y))auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width)solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media(min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media(min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media(min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:#fff;--bs-tooltip-bg:#000;--bs-tooltip-border-radius:0.375rem;--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;padding:var(--bs-tooltip-arrow-height);margin:var(--bs-tooltip-margin);font-family:open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height)calc(var(--bs-tooltip-arrow-width) * .5)0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5)var(--bs-tooltip-arrow-height)calc(var(--bs-tooltip-arrow-width) * .5)0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5)var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:0;width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5)0 calc(var(--bs-tooltip-arrow-width) * .5)var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y)var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:#fff;--bs-popover-border-width:1px;--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:0.5rem;--bs-popover-inner-border-radius:calc(0.5rem - 1px);--bs-popover-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: ;--bs-popover-header-bg:#f0f0f0;--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:#212529;--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width)solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius);box-shadow:var(--bs-popover-box-shadow)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height)calc(var(--bs-popover-arrow-width) * .5)0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width) * .5)var(--bs-popover-arrow-height)calc(var(--bs-popover-arrow-width) * .5)0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width) * .5)var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width)solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width) * .5)0 calc(var(--bs-popover-arrow-width) * .5)var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y)var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width)solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y)var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion:reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0;background-image:linear-gradient(90deg,rgba(0,0,0,.25),rgba(0,0,0,.1%))}.carousel-control-next{right:0;background-image:linear-gradient(270deg,rgba(0,0,0,.25),rgba(0,0,0,.1%))}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:initial;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1)grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed)linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width)solid;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media(prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color: ;--bs-offcanvas-bg:#fff;--bs-offcanvas-border-width:1px;--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)}@media(max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--bs-offcanvas-box-shadow);transition:transform .3s ease-in-out}}@media(max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media(max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--bs-offcanvas-box-shadow);transition:transform .3s ease-in-out}}@media(max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media(max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--bs-offcanvas-box-shadow);transition:transform .3s ease-in-out}}@media(max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media(max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--bs-offcanvas-box-shadow);transition:transform .3s ease-in-out}}@media(max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media(max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media(max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--bs-offcanvas-box-shadow);transition:transform .3s ease-in-out}}@media(max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media(max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--bs-offcanvas-box-shadow);transition:transform .3s ease-in-out}@media(prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width)solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y)var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y)var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before,div.drawio button.placeholder::before,.td-blog .placeholder.td-rss-button::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(8,27,75,var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#000!important;background-color:RGBA(255,255,255,var(--bs-bg-opacity,1))!important}.text-bg-success{color:#000!important;background-color:RGBA(55,114,255,var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(192,224,222,var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(237,106,90,var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#000!important;background-color:RGBA(237,106,90,var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(211,243,238,var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(64,63,76,var(--bs-bg-opacity,1))!important}.link-primary{color:#081b4b!important}.link-primary:hover,.link-primary:focus{color:#061335!important}.link-secondary{color:#fff!important}.link-secondary:hover,.link-secondary:focus{color:#fff!important}.link-success{color:#3772ff!important}.link-success:hover,.link-success:focus{color:#739cff!important}.link-info{color:#c0e0de!important}.link-info:hover,.link-info:focus{color:#d3e9e8!important}.link-warning{color:#ed6a5a!important}.link-warning:hover,.link-warning:focus{color:#f2978c!important}.link-danger{color:#ed6a5a!important}.link-danger:hover,.link-danger:focus{color:#f2978c!important}.link-light{color:#d3f3ee!important}.link-light:hover,.link-light:focus{color:#e0f7f3!important}.link-dark{color:#403f4c!important}.link-dark:hover,.link-dark:focus{color:#2d2c35!important}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width:576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width:1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-0{border:0!important}.border-top,.td-page-meta__lastmod{border-top:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width)var(--bs-border-style)var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-1{--bs-border-width:1px}.border-2{--bs-border-width:2px}.border-3{--bs-border-width:3px}.border-4{--bs-border-width:4px}.border-5{--bs-border-width:5px}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.275rem + .3vw)!important}.fs-4{font-size:calc(1.26rem + .12vw)!important}.fs-5{font-size:1.15rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-semibold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted,.td-page-meta__lastmod{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-2xl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media(min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media(min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media(min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block,.td-blog .td-rss-button{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media(min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media(min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media(min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.5rem!important}.fs-4{font-size:1.35rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}/*!* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com +* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) +* Copyright 2023 Fonticons, Inc.*/.fa,.td-search__icon:before{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.td-search__icon:before,.fa-classic,.fa-sharp,.fas,.td-offline-search-results__close-button:after,.fa-solid,.far,.fa-regular,.fab,.fa-brands{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fas,.td-offline-search-results__close-button:after,.fa-classic,.fa-solid,.far,.fa-regular{font-family:'font awesome 6 free'}.fab,.fa-brands{font-family:'font awesome 6 brands'}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07142857em;vertical-align:.05357143em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04166667em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width,2em) * -1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-color:var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);border-style:var(--fa-border-style,solid);border-width:var(--fa-border-width,.08em);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade{animation-name:fa-beat-fade;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin{animation-name:fa-spin;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media(prefers-reduced-motion:reduce){.fa-beat,.fa-bounce,.fa-fade,.fa-beat-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1,1)translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9))translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1))translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95))translateY(0)}57%{transform:scale(1,1)translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1,1)translateY(0)}100%{transform:scale(1,1)translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,100%{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,100%{transform:rotate(0)}}@keyframes fa-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scale(-1,1)}.fa-flip-vertical{transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1,-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0::before{content:"\30"}.fa-1::before{content:"\31"}.fa-2::before{content:"\32"}.fa-3::before{content:"\33"}.fa-4::before{content:"\34"}.fa-5::before{content:"\35"}.fa-6::before{content:"\36"}.fa-7::before{content:"\37"}.fa-8::before{content:"\38"}.fa-9::before{content:"\39"}.fa-fill-drip::before{content:"\f576"}.fa-arrows-to-circle::before{content:"\e4bd"}.fa-circle-chevron-right::before{content:"\f138"}.fa-chevron-circle-right::before{content:"\f138"}.fa-at::before{content:"\40"}.fa-trash-can::before{content:"\f2ed"}.fa-trash-alt::before{content:"\f2ed"}.fa-text-height::before{content:"\f034"}.fa-user-xmark::before{content:"\f235"}.fa-user-times::before{content:"\f235"}.fa-stethoscope::before{content:"\f0f1"}.fa-message::before{content:"\f27a"}.fa-comment-alt::before{content:"\f27a"}.fa-info::before{content:"\f129"}.fa-down-left-and-up-right-to-center::before{content:"\f422"}.fa-compress-alt::before{content:"\f422"}.fa-explosion::before{content:"\e4e9"}.fa-file-lines::before{content:"\f15c"}.fa-file-alt::before{content:"\f15c"}.fa-file-text::before{content:"\f15c"}.fa-wave-square::before{content:"\f83e"}.fa-ring::before{content:"\f70b"}.fa-building-un::before{content:"\e4d9"}.fa-dice-three::before{content:"\f527"}.fa-calendar-days::before{content:"\f073"}.fa-calendar-alt::before{content:"\f073"}.fa-anchor-circle-check::before{content:"\e4aa"}.fa-building-circle-arrow-right::before{content:"\e4d1"}.fa-volleyball::before{content:"\f45f"}.fa-volleyball-ball::before{content:"\f45f"}.fa-arrows-up-to-line::before{content:"\e4c2"}.fa-sort-down::before{content:"\f0dd"}.fa-sort-desc::before{content:"\f0dd"}.fa-circle-minus::before{content:"\f056"}.fa-minus-circle::before{content:"\f056"}.fa-door-open::before{content:"\f52b"}.fa-right-from-bracket::before{content:"\f2f5"}.fa-sign-out-alt::before{content:"\f2f5"}.fa-atom::before{content:"\f5d2"}.fa-soap::before{content:"\e06e"}.fa-icons::before{content:"\f86d"}.fa-heart-music-camera-bolt::before{content:"\f86d"}.fa-microphone-lines-slash::before{content:"\f539"}.fa-microphone-alt-slash::before{content:"\f539"}.fa-bridge-circle-check::before{content:"\e4c9"}.fa-pump-medical::before{content:"\e06a"}.fa-fingerprint::before{content:"\f577"}.fa-hand-point-right::before{content:"\f0a4"}.fa-magnifying-glass-location::before{content:"\f689"}.fa-search-location::before{content:"\f689"}.fa-forward-step::before{content:"\f051"}.fa-step-forward::before{content:"\f051"}.fa-face-smile-beam::before{content:"\f5b8"}.fa-smile-beam::before{content:"\f5b8"}.fa-flag-checkered::before{content:"\f11e"}.fa-football::before{content:"\f44e"}.fa-football-ball::before{content:"\f44e"}.fa-school-circle-exclamation::before{content:"\e56c"}.fa-crop::before{content:"\f125"}.fa-angles-down::before{content:"\f103"}.fa-angle-double-down::before{content:"\f103"}.fa-users-rectangle::before{content:"\e594"}.fa-people-roof::before{content:"\e537"}.fa-people-line::before{content:"\e534"}.fa-beer-mug-empty::before{content:"\f0fc"}.fa-beer::before{content:"\f0fc"}.fa-diagram-predecessor::before{content:"\e477"}.fa-arrow-up-long::before{content:"\f176"}.fa-long-arrow-up::before{content:"\f176"}.fa-fire-flame-simple::before{content:"\f46a"}.fa-burn::before{content:"\f46a"}.fa-person::before{content:"\f183"}.fa-male::before{content:"\f183"}.fa-laptop::before{content:"\f109"}.fa-file-csv::before{content:"\f6dd"}.fa-menorah::before{content:"\f676"}.fa-truck-plane::before{content:"\e58f"}.fa-record-vinyl::before{content:"\f8d9"}.fa-face-grin-stars::before{content:"\f587"}.fa-grin-stars::before{content:"\f587"}.fa-bong::before{content:"\f55c"}.fa-spaghetti-monster-flying::before{content:"\f67b"}.fa-pastafarianism::before{content:"\f67b"}.fa-arrow-down-up-across-line::before{content:"\e4af"}.fa-spoon::before{content:"\f2e5"}.fa-utensil-spoon::before{content:"\f2e5"}.fa-jar-wheat::before{content:"\e517"}.fa-envelopes-bulk::before{content:"\f674"}.fa-mail-bulk::before{content:"\f674"}.fa-file-circle-exclamation::before{content:"\e4eb"}.fa-circle-h::before{content:"\f47e"}.fa-hospital-symbol::before{content:"\f47e"}.fa-pager::before{content:"\f815"}.fa-address-book::before{content:"\f2b9"}.fa-contact-book::before{content:"\f2b9"}.fa-strikethrough::before{content:"\f0cc"}.fa-k::before{content:"\4b"}.fa-landmark-flag::before{content:"\e51c"}.fa-pencil::before{content:"\f303"}.fa-pencil-alt::before{content:"\f303"}.fa-backward::before{content:"\f04a"}.fa-caret-right::before{content:"\f0da"}.fa-comments::before{content:"\f086"}.fa-paste::before{content:"\f0ea"}.fa-file-clipboard::before{content:"\f0ea"}.fa-code-pull-request::before{content:"\e13c"}.fa-clipboard-list::before{content:"\f46d"}.fa-truck-ramp-box::before{content:"\f4de"}.fa-truck-loading::before{content:"\f4de"}.fa-user-check::before{content:"\f4fc"}.fa-vial-virus::before{content:"\e597"}.fa-sheet-plastic::before{content:"\e571"}.fa-blog::before{content:"\f781"}.fa-user-ninja::before{content:"\f504"}.fa-person-arrow-up-from-line::before{content:"\e539"}.fa-scroll-torah::before{content:"\f6a0"}.fa-torah::before{content:"\f6a0"}.fa-broom-ball::before{content:"\f458"}.fa-quidditch::before{content:"\f458"}.fa-quidditch-broom-ball::before{content:"\f458"}.fa-toggle-off::before{content:"\f204"}.fa-box-archive::before{content:"\f187"}.fa-archive::before{content:"\f187"}.fa-person-drowning::before{content:"\e545"}.fa-arrow-down-9-1::before{content:"\f886"}.fa-sort-numeric-desc::before{content:"\f886"}.fa-sort-numeric-down-alt::before{content:"\f886"}.fa-face-grin-tongue-squint::before{content:"\f58a"}.fa-grin-tongue-squint::before{content:"\f58a"}.fa-spray-can::before{content:"\f5bd"}.fa-truck-monster::before{content:"\f63b"}.fa-w::before{content:"\57"}.fa-earth-africa::before{content:"\f57c"}.fa-globe-africa::before{content:"\f57c"}.fa-rainbow::before{content:"\f75b"}.fa-circle-notch::before{content:"\f1ce"}.fa-tablet-screen-button::before{content:"\f3fa"}.fa-tablet-alt::before{content:"\f3fa"}.fa-paw::before{content:"\f1b0"}.fa-cloud::before{content:"\f0c2"}.fa-trowel-bricks::before{content:"\e58a"}.fa-face-flushed::before{content:"\f579"}.fa-flushed::before{content:"\f579"}.fa-hospital-user::before{content:"\f80d"}.fa-tent-arrow-left-right::before{content:"\e57f"}.fa-gavel::before{content:"\f0e3"}.fa-legal::before{content:"\f0e3"}.fa-binoculars::before{content:"\f1e5"}.fa-microphone-slash::before{content:"\f131"}.fa-box-tissue::before{content:"\e05b"}.fa-motorcycle::before{content:"\f21c"}.fa-bell-concierge::before{content:"\f562"}.fa-concierge-bell::before{content:"\f562"}.fa-pen-ruler::before{content:"\f5ae"}.fa-pencil-ruler::before{content:"\f5ae"}.fa-people-arrows::before{content:"\e068"}.fa-people-arrows-left-right::before{content:"\e068"}.fa-mars-and-venus-burst::before{content:"\e523"}.fa-square-caret-right::before{content:"\f152"}.fa-caret-square-right::before{content:"\f152"}.fa-scissors::before{content:"\f0c4"}.fa-cut::before{content:"\f0c4"}.fa-sun-plant-wilt::before{content:"\e57a"}.fa-toilets-portable::before{content:"\e584"}.fa-hockey-puck::before{content:"\f453"}.fa-table::before{content:"\f0ce"}.fa-magnifying-glass-arrow-right::before{content:"\e521"}.fa-tachograph-digital::before{content:"\f566"}.fa-digital-tachograph::before{content:"\f566"}.fa-users-slash::before{content:"\e073"}.fa-clover::before{content:"\e139"}.fa-reply::before{content:"\f3e5"}.fa-mail-reply::before{content:"\f3e5"}.fa-star-and-crescent::before{content:"\f699"}.fa-house-fire::before{content:"\e50c"}.fa-square-minus::before{content:"\f146"}.fa-minus-square::before{content:"\f146"}.fa-helicopter::before{content:"\f533"}.fa-compass::before{content:"\f14e"}.fa-square-caret-down::before{content:"\f150"}.fa-caret-square-down::before{content:"\f150"}.fa-file-circle-question::before{content:"\e4ef"}.fa-laptop-code::before{content:"\f5fc"}.fa-swatchbook::before{content:"\f5c3"}.fa-prescription-bottle::before{content:"\f485"}.fa-bars::before{content:"\f0c9"}.fa-navicon::before{content:"\f0c9"}.fa-people-group::before{content:"\e533"}.fa-hourglass-end::before{content:"\f253"}.fa-hourglass-3::before{content:"\f253"}.fa-heart-crack::before{content:"\f7a9"}.fa-heart-broken::before{content:"\f7a9"}.fa-square-up-right::before{content:"\f360"}.fa-external-link-square-alt::before{content:"\f360"}.fa-face-kiss-beam::before{content:"\f597"}.fa-kiss-beam::before{content:"\f597"}.fa-film::before{content:"\f008"}.fa-ruler-horizontal::before{content:"\f547"}.fa-people-robbery::before{content:"\e536"}.fa-lightbulb::before{content:"\f0eb"}.fa-caret-left::before{content:"\f0d9"}.fa-circle-exclamation::before{content:"\f06a"}.fa-exclamation-circle::before{content:"\f06a"}.fa-school-circle-xmark::before{content:"\e56d"}.fa-arrow-right-from-bracket::before{content:"\f08b"}.fa-sign-out::before{content:"\f08b"}.fa-circle-chevron-down::before{content:"\f13a"}.fa-chevron-circle-down::before{content:"\f13a"}.fa-unlock-keyhole::before{content:"\f13e"}.fa-unlock-alt::before{content:"\f13e"}.fa-cloud-showers-heavy::before{content:"\f740"}.fa-headphones-simple::before{content:"\f58f"}.fa-headphones-alt::before{content:"\f58f"}.fa-sitemap::before{content:"\f0e8"}.fa-circle-dollar-to-slot::before{content:"\f4b9"}.fa-donate::before{content:"\f4b9"}.fa-memory::before{content:"\f538"}.fa-road-spikes::before{content:"\e568"}.fa-fire-burner::before{content:"\e4f1"}.fa-flag::before{content:"\f024"}.fa-hanukiah::before{content:"\f6e6"}.fa-feather::before{content:"\f52d"}.fa-volume-low::before{content:"\f027"}.fa-volume-down::before{content:"\f027"}.fa-comment-slash::before{content:"\f4b3"}.fa-cloud-sun-rain::before{content:"\f743"}.fa-compress::before{content:"\f066"}.fa-wheat-awn::before{content:"\e2cd"}.fa-wheat-alt::before{content:"\e2cd"}.fa-ankh::before{content:"\f644"}.fa-hands-holding-child::before{content:"\e4fa"}.fa-asterisk::before{content:"\2a"}.fa-square-check::before{content:"\f14a"}.fa-check-square::before{content:"\f14a"}.fa-peseta-sign::before{content:"\e221"}.fa-heading::before{content:"\f1dc"}.fa-header::before{content:"\f1dc"}.fa-ghost::before{content:"\f6e2"}.fa-list::before{content:"\f03a"}.fa-list-squares::before{content:"\f03a"}.fa-square-phone-flip::before{content:"\f87b"}.fa-phone-square-alt::before{content:"\f87b"}.fa-cart-plus::before{content:"\f217"}.fa-gamepad::before{content:"\f11b"}.fa-circle-dot::before{content:"\f192"}.fa-dot-circle::before{content:"\f192"}.fa-face-dizzy::before{content:"\f567"}.fa-dizzy::before{content:"\f567"}.fa-egg::before{content:"\f7fb"}.fa-house-medical-circle-xmark::before{content:"\e513"}.fa-campground::before{content:"\f6bb"}.fa-folder-plus::before{content:"\f65e"}.fa-futbol::before{content:"\f1e3"}.fa-futbol-ball::before{content:"\f1e3"}.fa-soccer-ball::before{content:"\f1e3"}.fa-paintbrush::before{content:"\f1fc"}.fa-paint-brush::before{content:"\f1fc"}.fa-lock::before{content:"\f023"}.fa-gas-pump::before{content:"\f52f"}.fa-hot-tub-person::before{content:"\f593"}.fa-hot-tub::before{content:"\f593"}.fa-map-location::before{content:"\f59f"}.fa-map-marked::before{content:"\f59f"}.fa-house-flood-water::before{content:"\e50e"}.fa-tree::before{content:"\f1bb"}.fa-bridge-lock::before{content:"\e4cc"}.fa-sack-dollar::before{content:"\f81d"}.fa-pen-to-square::before{content:"\f044"}.fa-edit::before{content:"\f044"}.fa-car-side::before{content:"\f5e4"}.fa-share-nodes::before{content:"\f1e0"}.fa-share-alt::before{content:"\f1e0"}.fa-heart-circle-minus::before{content:"\e4ff"}.fa-hourglass-half::before{content:"\f252"}.fa-hourglass-2::before{content:"\f252"}.fa-microscope::before{content:"\f610"}.fa-sink::before{content:"\e06d"}.fa-bag-shopping::before{content:"\f290"}.fa-shopping-bag::before{content:"\f290"}.fa-arrow-down-z-a::before{content:"\f881"}.fa-sort-alpha-desc::before{content:"\f881"}.fa-sort-alpha-down-alt::before{content:"\f881"}.fa-mitten::before{content:"\f7b5"}.fa-person-rays::before{content:"\e54d"}.fa-users::before{content:"\f0c0"}.fa-eye-slash::before{content:"\f070"}.fa-flask-vial::before{content:"\e4f3"}.fa-hand::before{content:"\f256"}.fa-hand-paper::before{content:"\f256"}.fa-om::before{content:"\f679"}.fa-worm::before{content:"\e599"}.fa-house-circle-xmark::before{content:"\e50b"}.fa-plug::before{content:"\f1e6"}.fa-chevron-up::before{content:"\f077"}.fa-hand-spock::before{content:"\f259"}.fa-stopwatch::before{content:"\f2f2"}.fa-face-kiss::before{content:"\f596"}.fa-kiss::before{content:"\f596"}.fa-bridge-circle-xmark::before{content:"\e4cb"}.fa-face-grin-tongue::before{content:"\f589"}.fa-grin-tongue::before{content:"\f589"}.fa-chess-bishop::before{content:"\f43a"}.fa-face-grin-wink::before{content:"\f58c"}.fa-grin-wink::before{content:"\f58c"}.fa-ear-deaf::before{content:"\f2a4"}.fa-deaf::before{content:"\f2a4"}.fa-deafness::before{content:"\f2a4"}.fa-hard-of-hearing::before{content:"\f2a4"}.fa-road-circle-check::before{content:"\e564"}.fa-dice-five::before{content:"\f523"}.fa-square-rss::before{content:"\f143"}.fa-rss-square::before{content:"\f143"}.fa-land-mine-on::before{content:"\e51b"}.fa-i-cursor::before{content:"\f246"}.fa-stamp::before{content:"\f5bf"}.fa-stairs::before{content:"\e289"}.fa-i::before{content:"\49"}.fa-hryvnia-sign::before{content:"\f6f2"}.fa-hryvnia::before{content:"\f6f2"}.fa-pills::before{content:"\f484"}.fa-face-grin-wide::before{content:"\f581"}.fa-grin-alt::before{content:"\f581"}.fa-tooth::before{content:"\f5c9"}.fa-v::before{content:"\56"}.fa-bangladeshi-taka-sign::before{content:"\e2e6"}.fa-bicycle::before{content:"\f206"}.fa-staff-snake::before{content:"\e579"}.fa-rod-asclepius::before{content:"\e579"}.fa-rod-snake::before{content:"\e579"}.fa-staff-aesculapius::before{content:"\e579"}.fa-head-side-cough-slash::before{content:"\e062"}.fa-truck-medical::before{content:"\f0f9"}.fa-ambulance::before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation::before{content:"\e598"}.fa-snowman::before{content:"\f7d0"}.fa-mortar-pestle::before{content:"\f5a7"}.fa-road-barrier::before{content:"\e562"}.fa-school::before{content:"\f549"}.fa-igloo::before{content:"\f7ae"}.fa-joint::before{content:"\f595"}.fa-angle-right::before{content:"\f105"}.fa-horse::before{content:"\f6f0"}.fa-q::before{content:"\51"}.fa-g::before{content:"\47"}.fa-notes-medical::before{content:"\f481"}.fa-temperature-half::before{content:"\f2c9"}.fa-temperature-2::before{content:"\f2c9"}.fa-thermometer-2::before{content:"\f2c9"}.fa-thermometer-half::before{content:"\f2c9"}.fa-dong-sign::before{content:"\e169"}.fa-capsules::before{content:"\f46b"}.fa-poo-storm::before{content:"\f75a"}.fa-poo-bolt::before{content:"\f75a"}.fa-face-frown-open::before{content:"\f57a"}.fa-frown-open::before{content:"\f57a"}.fa-hand-point-up::before{content:"\f0a6"}.fa-money-bill::before{content:"\f0d6"}.fa-bookmark::before{content:"\f02e"}.fa-align-justify::before{content:"\f039"}.fa-umbrella-beach::before{content:"\f5ca"}.fa-helmet-un::before{content:"\e503"}.fa-bullseye::before{content:"\f140"}.fa-bacon::before{content:"\f7e5"}.fa-hand-point-down::before{content:"\f0a7"}.fa-arrow-up-from-bracket::before{content:"\e09a"}.fa-folder::before{content:"\f07b"}.fa-folder-blank::before{content:"\f07b"}.fa-file-waveform::before{content:"\f478"}.fa-file-medical-alt::before{content:"\f478"}.fa-radiation::before{content:"\f7b9"}.fa-chart-simple::before{content:"\e473"}.fa-mars-stroke::before{content:"\f229"}.fa-vial::before{content:"\f492"}.fa-gauge::before{content:"\f624"}.fa-dashboard::before{content:"\f624"}.fa-gauge-med::before{content:"\f624"}.fa-tachometer-alt-average::before{content:"\f624"}.fa-wand-magic-sparkles::before{content:"\e2ca"}.fa-magic-wand-sparkles::before{content:"\e2ca"}.fa-e::before{content:"\45"}.fa-pen-clip::before{content:"\f305"}.fa-pen-alt::before{content:"\f305"}.fa-bridge-circle-exclamation::before{content:"\e4ca"}.fa-user::before{content:"\f007"}.fa-school-circle-check::before{content:"\e56b"}.fa-dumpster::before{content:"\f793"}.fa-van-shuttle::before{content:"\f5b6"}.fa-shuttle-van::before{content:"\f5b6"}.fa-building-user::before{content:"\e4da"}.fa-square-caret-left::before{content:"\f191"}.fa-caret-square-left::before{content:"\f191"}.fa-highlighter::before{content:"\f591"}.fa-key::before{content:"\f084"}.fa-bullhorn::before{content:"\f0a1"}.fa-globe::before{content:"\f0ac"}.fa-synagogue::before{content:"\f69b"}.fa-person-half-dress::before{content:"\e548"}.fa-road-bridge::before{content:"\e563"}.fa-location-arrow::before{content:"\f124"}.fa-c::before{content:"\43"}.fa-tablet-button::before{content:"\f10a"}.fa-building-lock::before{content:"\e4d6"}.fa-pizza-slice::before{content:"\f818"}.fa-money-bill-wave::before{content:"\f53a"}.fa-chart-area::before{content:"\f1fe"}.fa-area-chart::before{content:"\f1fe"}.fa-house-flag::before{content:"\e50d"}.fa-person-circle-minus::before{content:"\e540"}.fa-ban::before{content:"\f05e"}.fa-cancel::before{content:"\f05e"}.fa-camera-rotate::before{content:"\e0d8"}.fa-spray-can-sparkles::before{content:"\f5d0"}.fa-air-freshener::before{content:"\f5d0"}.fa-star::before{content:"\f005"}.fa-repeat::before{content:"\f363"}.fa-cross::before{content:"\f654"}.fa-box::before{content:"\f466"}.fa-venus-mars::before{content:"\f228"}.fa-arrow-pointer::before{content:"\f245"}.fa-mouse-pointer::before{content:"\f245"}.fa-maximize::before{content:"\f31e"}.fa-expand-arrows-alt::before{content:"\f31e"}.fa-charging-station::before{content:"\f5e7"}.fa-shapes::before{content:"\f61f"}.fa-triangle-circle-square::before{content:"\f61f"}.fa-shuffle::before{content:"\f074"}.fa-random::before{content:"\f074"}.fa-person-running::before{content:"\f70c"}.fa-running::before{content:"\f70c"}.fa-mobile-retro::before{content:"\e527"}.fa-grip-lines-vertical::before{content:"\f7a5"}.fa-spider::before{content:"\f717"}.fa-hands-bound::before{content:"\e4f9"}.fa-file-invoice-dollar::before{content:"\f571"}.fa-plane-circle-exclamation::before{content:"\e556"}.fa-x-ray::before{content:"\f497"}.fa-spell-check::before{content:"\f891"}.fa-slash::before{content:"\f715"}.fa-computer-mouse::before{content:"\f8cc"}.fa-mouse::before{content:"\f8cc"}.fa-arrow-right-to-bracket::before{content:"\f090"}.fa-sign-in::before{content:"\f090"}.fa-shop-slash::before{content:"\e070"}.fa-store-alt-slash::before{content:"\e070"}.fa-server::before{content:"\f233"}.fa-virus-covid-slash::before{content:"\e4a9"}.fa-shop-lock::before{content:"\e4a5"}.fa-hourglass-start::before{content:"\f251"}.fa-hourglass-1::before{content:"\f251"}.fa-blender-phone::before{content:"\f6b6"}.fa-building-wheat::before{content:"\e4db"}.fa-person-breastfeeding::before{content:"\e53a"}.fa-right-to-bracket::before{content:"\f2f6"}.fa-sign-in-alt::before{content:"\f2f6"}.fa-venus::before{content:"\f221"}.fa-passport::before{content:"\f5ab"}.fa-heart-pulse::before{content:"\f21e"}.fa-heartbeat::before{content:"\f21e"}.fa-people-carry-box::before{content:"\f4ce"}.fa-people-carry::before{content:"\f4ce"}.fa-temperature-high::before{content:"\f769"}.fa-microchip::before{content:"\f2db"}.fa-crown::before{content:"\f521"}.fa-weight-hanging::before{content:"\f5cd"}.fa-xmarks-lines::before{content:"\e59a"}.fa-file-prescription::before{content:"\f572"}.fa-weight-scale::before{content:"\f496"}.fa-weight::before{content:"\f496"}.fa-user-group::before{content:"\f500"}.fa-user-friends::before{content:"\f500"}.fa-arrow-up-a-z::before{content:"\f15e"}.fa-sort-alpha-up::before{content:"\f15e"}.fa-chess-knight::before{content:"\f441"}.fa-face-laugh-squint::before{content:"\f59b"}.fa-laugh-squint::before{content:"\f59b"}.fa-wheelchair::before{content:"\f193"}.fa-circle-arrow-up::before{content:"\f0aa"}.fa-arrow-circle-up::before{content:"\f0aa"}.fa-toggle-on::before{content:"\f205"}.fa-person-walking::before{content:"\f554"}.fa-walking::before{content:"\f554"}.fa-l::before{content:"\4c"}.fa-fire::before{content:"\f06d"}.fa-bed-pulse::before{content:"\f487"}.fa-procedures::before{content:"\f487"}.fa-shuttle-space::before{content:"\f197"}.fa-space-shuttle::before{content:"\f197"}.fa-face-laugh::before{content:"\f599"}.fa-laugh::before{content:"\f599"}.fa-folder-open::before{content:"\f07c"}.fa-heart-circle-plus::before{content:"\e500"}.fa-code-fork::before{content:"\e13b"}.fa-city::before{content:"\f64f"}.fa-microphone-lines::before{content:"\f3c9"}.fa-microphone-alt::before{content:"\f3c9"}.fa-pepper-hot::before{content:"\f816"}.fa-unlock::before{content:"\f09c"}.fa-colon-sign::before{content:"\e140"}.fa-headset::before{content:"\f590"}.fa-store-slash::before{content:"\e071"}.fa-road-circle-xmark::before{content:"\e566"}.fa-user-minus::before{content:"\f503"}.fa-mars-stroke-up::before{content:"\f22a"}.fa-mars-stroke-v::before{content:"\f22a"}.fa-champagne-glasses::before{content:"\f79f"}.fa-glass-cheers::before{content:"\f79f"}.fa-clipboard::before{content:"\f328"}.fa-house-circle-exclamation::before{content:"\e50a"}.fa-file-arrow-up::before{content:"\f574"}.fa-file-upload::before{content:"\f574"}.fa-wifi::before{content:"\f1eb"}.fa-wifi-3::before{content:"\f1eb"}.fa-wifi-strong::before{content:"\f1eb"}.fa-bath::before{content:"\f2cd"}.fa-bathtub::before{content:"\f2cd"}.fa-underline::before{content:"\f0cd"}.fa-user-pen::before{content:"\f4ff"}.fa-user-edit::before{content:"\f4ff"}.fa-signature::before{content:"\f5b7"}.fa-stroopwafel::before{content:"\f551"}.fa-bold::before{content:"\f032"}.fa-anchor-lock::before{content:"\e4ad"}.fa-building-ngo::before{content:"\e4d7"}.fa-manat-sign::before{content:"\e1d5"}.fa-not-equal::before{content:"\f53e"}.fa-border-top-left::before{content:"\f853"}.fa-border-style::before{content:"\f853"}.fa-map-location-dot::before{content:"\f5a0"}.fa-map-marked-alt::before{content:"\f5a0"}.fa-jedi::before{content:"\f669"}.fa-square-poll-vertical::before{content:"\f681"}.fa-poll::before{content:"\f681"}.fa-mug-hot::before{content:"\f7b6"}.fa-car-battery::before{content:"\f5df"}.fa-battery-car::before{content:"\f5df"}.fa-gift::before{content:"\f06b"}.fa-dice-two::before{content:"\f528"}.fa-chess-queen::before{content:"\f445"}.fa-glasses::before{content:"\f530"}.fa-chess-board::before{content:"\f43c"}.fa-building-circle-check::before{content:"\e4d2"}.fa-person-chalkboard::before{content:"\e53d"}.fa-mars-stroke-right::before{content:"\f22b"}.fa-mars-stroke-h::before{content:"\f22b"}.fa-hand-back-fist::before{content:"\f255"}.fa-hand-rock::before{content:"\f255"}.fa-square-caret-up::before{content:"\f151"}.fa-caret-square-up::before{content:"\f151"}.fa-cloud-showers-water::before{content:"\e4e4"}.fa-chart-bar::before{content:"\f080"}.fa-bar-chart::before{content:"\f080"}.fa-hands-bubbles::before{content:"\e05e"}.fa-hands-wash::before{content:"\e05e"}.fa-less-than-equal::before{content:"\f537"}.fa-train::before{content:"\f238"}.fa-eye-low-vision::before{content:"\f2a8"}.fa-low-vision::before{content:"\f2a8"}.fa-crow::before{content:"\f520"}.fa-sailboat::before{content:"\e445"}.fa-window-restore::before{content:"\f2d2"}.fa-square-plus::before{content:"\f0fe"}.fa-plus-square::before{content:"\f0fe"}.fa-torii-gate::before{content:"\f6a1"}.fa-frog::before{content:"\f52e"}.fa-bucket::before{content:"\e4cf"}.fa-image::before{content:"\f03e"}.fa-microphone::before{content:"\f130"}.fa-cow::before{content:"\f6c8"}.fa-caret-up::before{content:"\f0d8"}.fa-screwdriver::before{content:"\f54a"}.fa-folder-closed::before{content:"\e185"}.fa-house-tsunami::before{content:"\e515"}.fa-square-nfi::before{content:"\e576"}.fa-arrow-up-from-ground-water::before{content:"\e4b5"}.fa-martini-glass::before{content:"\f57b"}.fa-glass-martini-alt::before{content:"\f57b"}.fa-rotate-left::before{content:"\f2ea"}.fa-rotate-back::before{content:"\f2ea"}.fa-rotate-backward::before{content:"\f2ea"}.fa-undo-alt::before{content:"\f2ea"}.fa-table-columns::before{content:"\f0db"}.fa-columns::before{content:"\f0db"}.fa-lemon::before{content:"\f094"}.fa-head-side-mask::before{content:"\e063"}.fa-handshake::before{content:"\f2b5"}.fa-gem::before{content:"\f3a5"}.fa-dolly::before{content:"\f472"}.fa-dolly-box::before{content:"\f472"}.fa-smoking::before{content:"\f48d"}.fa-minimize::before{content:"\f78c"}.fa-compress-arrows-alt::before{content:"\f78c"}.fa-monument::before{content:"\f5a6"}.fa-snowplow::before{content:"\f7d2"}.fa-angles-right::before{content:"\f101"}.fa-angle-double-right::before{content:"\f101"}.fa-cannabis::before{content:"\f55f"}.fa-circle-play::before{content:"\f144"}.fa-play-circle::before{content:"\f144"}.fa-tablets::before{content:"\f490"}.fa-ethernet::before{content:"\f796"}.fa-euro-sign::before{content:"\f153"}.fa-eur::before{content:"\f153"}.fa-euro::before{content:"\f153"}.fa-chair::before{content:"\f6c0"}.fa-circle-check::before{content:"\f058"}.fa-check-circle::before{content:"\f058"}.fa-circle-stop::before{content:"\f28d"}.fa-stop-circle::before{content:"\f28d"}.fa-compass-drafting::before{content:"\f568"}.fa-drafting-compass::before{content:"\f568"}.fa-plate-wheat::before{content:"\e55a"}.fa-icicles::before{content:"\f7ad"}.fa-person-shelter::before{content:"\e54f"}.fa-neuter::before{content:"\f22c"}.fa-id-badge::before{content:"\f2c1"}.fa-marker::before{content:"\f5a1"}.fa-face-laugh-beam::before{content:"\f59a"}.fa-laugh-beam::before{content:"\f59a"}.fa-helicopter-symbol::before{content:"\e502"}.fa-universal-access::before{content:"\f29a"}.fa-circle-chevron-up::before{content:"\f139"}.fa-chevron-circle-up::before{content:"\f139"}.fa-lari-sign::before{content:"\e1c8"}.fa-volcano::before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right::before{content:"\e553"}.fa-sterling-sign::before{content:"\f154"}.fa-gbp::before{content:"\f154"}.fa-pound-sign::before{content:"\f154"}.fa-viruses::before{content:"\e076"}.fa-square-person-confined::before{content:"\e577"}.fa-user-tie::before{content:"\f508"}.fa-arrow-down-long::before{content:"\f175"}.fa-long-arrow-down::before{content:"\f175"}.fa-tent-arrow-down-to-line::before{content:"\e57e"}.fa-certificate::before{content:"\f0a3"}.fa-reply-all::before{content:"\f122"}.fa-mail-reply-all::before{content:"\f122"}.fa-suitcase::before{content:"\f0f2"}.fa-person-skating::before{content:"\f7c5"}.fa-skating::before{content:"\f7c5"}.fa-filter-circle-dollar::before{content:"\f662"}.fa-funnel-dollar::before{content:"\f662"}.fa-camera-retro::before{content:"\f083"}.fa-circle-arrow-down::before{content:"\f0ab"}.fa-arrow-circle-down::before{content:"\f0ab"}.fa-file-import::before{content:"\f56f"}.fa-arrow-right-to-file::before{content:"\f56f"}.fa-square-arrow-up-right::before{content:"\f14c"}.fa-external-link-square::before{content:"\f14c"}.fa-box-open::before{content:"\f49e"}.fa-scroll::before{content:"\f70e"}.fa-spa::before{content:"\f5bb"}.fa-location-pin-lock::before{content:"\e51f"}.fa-pause::before{content:"\f04c"}.fa-hill-avalanche::before{content:"\e507"}.fa-temperature-empty::before{content:"\f2cb"}.fa-temperature-0::before{content:"\f2cb"}.fa-thermometer-0::before{content:"\f2cb"}.fa-thermometer-empty::before{content:"\f2cb"}.fa-bomb::before{content:"\f1e2"}.fa-registered::before{content:"\f25d"}.fa-address-card::before{content:"\f2bb"}.fa-contact-card::before{content:"\f2bb"}.fa-vcard::before{content:"\f2bb"}.fa-scale-unbalanced-flip::before{content:"\f516"}.fa-balance-scale-right::before{content:"\f516"}.fa-subscript::before{content:"\f12c"}.fa-diamond-turn-right::before{content:"\f5eb"}.fa-directions::before{content:"\f5eb"}.fa-burst::before{content:"\e4dc"}.fa-house-laptop::before{content:"\e066"}.fa-laptop-house::before{content:"\e066"}.fa-face-tired::before{content:"\f5c8"}.fa-tired::before{content:"\f5c8"}.fa-money-bills::before{content:"\e1f3"}.fa-smog::before{content:"\f75f"}.fa-crutch::before{content:"\f7f7"}.fa-cloud-arrow-up::before{content:"\f0ee"}.fa-cloud-upload::before{content:"\f0ee"}.fa-cloud-upload-alt::before{content:"\f0ee"}.fa-palette::before{content:"\f53f"}.fa-arrows-turn-right::before{content:"\e4c0"}.fa-vest::before{content:"\e085"}.fa-ferry::before{content:"\e4ea"}.fa-arrows-down-to-people::before{content:"\e4b9"}.fa-seedling::before{content:"\f4d8"}.fa-sprout::before{content:"\f4d8"}.fa-left-right::before{content:"\f337"}.fa-arrows-alt-h::before{content:"\f337"}.fa-boxes-packing::before{content:"\e4c7"}.fa-circle-arrow-left::before{content:"\f0a8"}.fa-arrow-circle-left::before{content:"\f0a8"}.fa-group-arrows-rotate::before{content:"\e4f6"}.fa-bowl-food::before{content:"\e4c6"}.fa-candy-cane::before{content:"\f786"}.fa-arrow-down-wide-short::before{content:"\f160"}.fa-sort-amount-asc::before{content:"\f160"}.fa-sort-amount-down::before{content:"\f160"}.fa-cloud-bolt::before{content:"\f76c"}.fa-thunderstorm::before{content:"\f76c"}.fa-text-slash::before{content:"\f87d"}.fa-remove-format::before{content:"\f87d"}.fa-face-smile-wink::before{content:"\f4da"}.fa-smile-wink::before{content:"\f4da"}.fa-file-word::before{content:"\f1c2"}.fa-file-powerpoint::before{content:"\f1c4"}.fa-arrows-left-right::before{content:"\f07e"}.fa-arrows-h::before{content:"\f07e"}.fa-house-lock::before{content:"\e510"}.fa-cloud-arrow-down::before{content:"\f0ed"}.fa-cloud-download::before{content:"\f0ed"}.fa-cloud-download-alt::before{content:"\f0ed"}.fa-children::before{content:"\e4e1"}.fa-chalkboard::before{content:"\f51b"}.fa-blackboard::before{content:"\f51b"}.fa-user-large-slash::before{content:"\f4fa"}.fa-user-alt-slash::before{content:"\f4fa"}.fa-envelope-open::before{content:"\f2b6"}.fa-handshake-simple-slash::before{content:"\e05f"}.fa-handshake-alt-slash::before{content:"\e05f"}.fa-mattress-pillow::before{content:"\e525"}.fa-guarani-sign::before{content:"\e19a"}.fa-arrows-rotate::before{content:"\f021"}.fa-refresh::before{content:"\f021"}.fa-sync::before{content:"\f021"}.fa-fire-extinguisher::before{content:"\f134"}.fa-cruzeiro-sign::before{content:"\e152"}.fa-greater-than-equal::before{content:"\f532"}.fa-shield-halved::before{content:"\f3ed"}.fa-shield-alt::before{content:"\f3ed"}.fa-book-atlas::before{content:"\f558"}.fa-atlas::before{content:"\f558"}.fa-virus::before{content:"\e074"}.fa-envelope-circle-check::before{content:"\e4e8"}.fa-layer-group::before{content:"\f5fd"}.fa-arrows-to-dot::before{content:"\e4be"}.fa-archway::before{content:"\f557"}.fa-heart-circle-check::before{content:"\e4fd"}.fa-house-chimney-crack::before{content:"\f6f1"}.fa-house-damage::before{content:"\f6f1"}.fa-file-zipper::before{content:"\f1c6"}.fa-file-archive::before{content:"\f1c6"}.fa-square::before{content:"\f0c8"}.fa-martini-glass-empty::before{content:"\f000"}.fa-glass-martini::before{content:"\f000"}.fa-couch::before{content:"\f4b8"}.fa-cedi-sign::before{content:"\e0df"}.fa-italic::before{content:"\f033"}.fa-church::before{content:"\f51d"}.fa-comments-dollar::before{content:"\f653"}.fa-democrat::before{content:"\f747"}.fa-z::before{content:"\5a"}.fa-person-skiing::before{content:"\f7c9"}.fa-skiing::before{content:"\f7c9"}.fa-road-lock::before{content:"\e567"}.fa-a::before{content:"\41"}.fa-temperature-arrow-down::before{content:"\e03f"}.fa-temperature-down::before{content:"\e03f"}.fa-feather-pointed::before{content:"\f56b"}.fa-feather-alt::before{content:"\f56b"}.fa-p::before{content:"\50"}.fa-snowflake::before{content:"\f2dc"}.fa-newspaper::before{content:"\f1ea"}.fa-rectangle-ad::before{content:"\f641"}.fa-ad::before{content:"\f641"}.fa-circle-arrow-right::before{content:"\f0a9"}.fa-arrow-circle-right::before{content:"\f0a9"}.fa-filter-circle-xmark::before{content:"\e17b"}.fa-locust::before{content:"\e520"}.fa-sort::before{content:"\f0dc"}.fa-unsorted::before{content:"\f0dc"}.fa-list-ol::before{content:"\f0cb"}.fa-list-1-2::before{content:"\f0cb"}.fa-list-numeric::before{content:"\f0cb"}.fa-person-dress-burst::before{content:"\e544"}.fa-money-check-dollar::before{content:"\f53d"}.fa-money-check-alt::before{content:"\f53d"}.fa-vector-square::before{content:"\f5cb"}.fa-bread-slice::before{content:"\f7ec"}.fa-language::before{content:"\f1ab"}.fa-face-kiss-wink-heart::before{content:"\f598"}.fa-kiss-wink-heart::before{content:"\f598"}.fa-filter::before{content:"\f0b0"}.fa-question::before{content:"\3f"}.fa-file-signature::before{content:"\f573"}.fa-up-down-left-right::before{content:"\f0b2"}.fa-arrows-alt::before{content:"\f0b2"}.fa-house-chimney-user::before{content:"\e065"}.fa-hand-holding-heart::before{content:"\f4be"}.fa-puzzle-piece::before{content:"\f12e"}.fa-money-check::before{content:"\f53c"}.fa-star-half-stroke::before{content:"\f5c0"}.fa-star-half-alt::before{content:"\f5c0"}.fa-code::before{content:"\f121"}.fa-whiskey-glass::before{content:"\f7a0"}.fa-glass-whiskey::before{content:"\f7a0"}.fa-building-circle-exclamation::before{content:"\e4d3"}.fa-magnifying-glass-chart::before{content:"\e522"}.fa-arrow-up-right-from-square::before{content:"\f08e"}.fa-external-link::before{content:"\f08e"}.fa-cubes-stacked::before{content:"\e4e6"}.fa-won-sign::before{content:"\f159"}.fa-krw::before{content:"\f159"}.fa-won::before{content:"\f159"}.fa-virus-covid::before{content:"\e4a8"}.fa-austral-sign::before{content:"\e0a9"}.fa-f::before{content:"\46"}.fa-leaf::before{content:"\f06c"}.fa-road::before{content:"\f018"}.fa-taxi::before{content:"\f1ba"}.fa-cab::before{content:"\f1ba"}.fa-person-circle-plus::before{content:"\e541"}.fa-chart-pie::before{content:"\f200"}.fa-pie-chart::before{content:"\f200"}.fa-bolt-lightning::before{content:"\e0b7"}.fa-sack-xmark::before{content:"\e56a"}.fa-file-excel::before{content:"\f1c3"}.fa-file-contract::before{content:"\f56c"}.fa-fish-fins::before{content:"\e4f2"}.fa-building-flag::before{content:"\e4d5"}.fa-face-grin-beam::before{content:"\f582"}.fa-grin-beam::before{content:"\f582"}.fa-object-ungroup::before{content:"\f248"}.fa-poop::before{content:"\f619"}.fa-location-pin::before{content:"\f041"}.fa-map-marker::before{content:"\f041"}.fa-kaaba::before{content:"\f66b"}.fa-toilet-paper::before{content:"\f71e"}.fa-helmet-safety::before{content:"\f807"}.fa-hard-hat::before{content:"\f807"}.fa-hat-hard::before{content:"\f807"}.fa-eject::before{content:"\f052"}.fa-circle-right::before{content:"\f35a"}.fa-arrow-alt-circle-right::before{content:"\f35a"}.fa-plane-circle-check::before{content:"\e555"}.fa-face-rolling-eyes::before{content:"\f5a5"}.fa-meh-rolling-eyes::before{content:"\f5a5"}.fa-object-group::before{content:"\f247"}.fa-chart-line::before{content:"\f201"}.fa-line-chart::before{content:"\f201"}.fa-mask-ventilator::before{content:"\e524"}.fa-arrow-right::before{content:"\f061"}.fa-signs-post::before{content:"\f277"}.fa-map-signs::before{content:"\f277"}.fa-cash-register::before{content:"\f788"}.fa-person-circle-question::before{content:"\e542"}.fa-h::before{content:"\48"}.fa-tarp::before{content:"\e57b"}.fa-screwdriver-wrench::before{content:"\f7d9"}.fa-tools::before{content:"\f7d9"}.fa-arrows-to-eye::before{content:"\e4bf"}.fa-plug-circle-bolt::before{content:"\e55b"}.fa-heart::before{content:"\f004"}.fa-mars-and-venus::before{content:"\f224"}.fa-house-user::before{content:"\e1b0"}.fa-home-user::before{content:"\e1b0"}.fa-dumpster-fire::before{content:"\f794"}.fa-house-crack::before{content:"\e3b1"}.fa-martini-glass-citrus::before{content:"\f561"}.fa-cocktail::before{content:"\f561"}.fa-face-surprise::before{content:"\f5c2"}.fa-surprise::before{content:"\f5c2"}.fa-bottle-water::before{content:"\e4c5"}.fa-circle-pause::before{content:"\f28b"}.fa-pause-circle::before{content:"\f28b"}.fa-toilet-paper-slash::before{content:"\e072"}.fa-apple-whole::before{content:"\f5d1"}.fa-apple-alt::before{content:"\f5d1"}.fa-kitchen-set::before{content:"\e51a"}.fa-r::before{content:"\52"}.fa-temperature-quarter::before{content:"\f2ca"}.fa-temperature-1::before{content:"\f2ca"}.fa-thermometer-1::before{content:"\f2ca"}.fa-thermometer-quarter::before{content:"\f2ca"}.fa-cube::before{content:"\f1b2"}.fa-bitcoin-sign::before{content:"\e0b4"}.fa-shield-dog::before{content:"\e573"}.fa-solar-panel::before{content:"\f5ba"}.fa-lock-open::before{content:"\f3c1"}.fa-elevator::before{content:"\e16d"}.fa-money-bill-transfer::before{content:"\e528"}.fa-money-bill-trend-up::before{content:"\e529"}.fa-house-flood-water-circle-arrow-right::before{content:"\e50f"}.fa-square-poll-horizontal::before{content:"\f682"}.fa-poll-h::before{content:"\f682"}.fa-circle::before{content:"\f111"}.fa-backward-fast::before{content:"\f049"}.fa-fast-backward::before{content:"\f049"}.fa-recycle::before{content:"\f1b8"}.fa-user-astronaut::before{content:"\f4fb"}.fa-plane-slash::before{content:"\e069"}.fa-trademark::before{content:"\f25c"}.fa-basketball::before{content:"\f434"}.fa-basketball-ball::before{content:"\f434"}.fa-satellite-dish::before{content:"\f7c0"}.fa-circle-up::before{content:"\f35b"}.fa-arrow-alt-circle-up::before{content:"\f35b"}.fa-mobile-screen-button::before{content:"\f3cd"}.fa-mobile-alt::before{content:"\f3cd"}.fa-volume-high::before{content:"\f028"}.fa-volume-up::before{content:"\f028"}.fa-users-rays::before{content:"\e593"}.fa-wallet::before{content:"\f555"}.fa-clipboard-check::before{content:"\f46c"}.fa-file-audio::before{content:"\f1c7"}.fa-burger::before{content:"\f805"}.fa-hamburger::before{content:"\f805"}.fa-wrench::before{content:"\f0ad"}.fa-bugs::before{content:"\e4d0"}.fa-rupee-sign::before{content:"\f156"}.fa-rupee::before{content:"\f156"}.fa-file-image::before{content:"\f1c5"}.fa-circle-question::before{content:"\f059"}.fa-question-circle::before{content:"\f059"}.fa-plane-departure::before{content:"\f5b0"}.fa-handshake-slash::before{content:"\e060"}.fa-book-bookmark::before{content:"\e0bb"}.fa-code-branch::before{content:"\f126"}.fa-hat-cowboy::before{content:"\f8c0"}.fa-bridge::before{content:"\e4c8"}.fa-phone-flip::before{content:"\f879"}.fa-phone-alt::before{content:"\f879"}.fa-truck-front::before{content:"\e2b7"}.fa-cat::before{content:"\f6be"}.fa-anchor-circle-exclamation::before{content:"\e4ab"}.fa-truck-field::before{content:"\e58d"}.fa-route::before{content:"\f4d7"}.fa-clipboard-question::before{content:"\e4e3"}.fa-panorama::before{content:"\e209"}.fa-comment-medical::before{content:"\f7f5"}.fa-teeth-open::before{content:"\f62f"}.fa-file-circle-minus::before{content:"\e4ed"}.fa-tags::before{content:"\f02c"}.fa-wine-glass::before{content:"\f4e3"}.fa-forward-fast::before{content:"\f050"}.fa-fast-forward::before{content:"\f050"}.fa-face-meh-blank::before{content:"\f5a4"}.fa-meh-blank::before{content:"\f5a4"}.fa-square-parking::before{content:"\f540"}.fa-parking::before{content:"\f540"}.fa-house-signal::before{content:"\e012"}.fa-bars-progress::before{content:"\f828"}.fa-tasks-alt::before{content:"\f828"}.fa-faucet-drip::before{content:"\e006"}.fa-cart-flatbed::before{content:"\f474"}.fa-dolly-flatbed::before{content:"\f474"}.fa-ban-smoking::before{content:"\f54d"}.fa-smoking-ban::before{content:"\f54d"}.fa-terminal::before{content:"\f120"}.fa-mobile-button::before{content:"\f10b"}.fa-house-medical-flag::before{content:"\e514"}.fa-basket-shopping::before{content:"\f291"}.fa-shopping-basket::before{content:"\f291"}.fa-tape::before{content:"\f4db"}.fa-bus-simple::before{content:"\f55e"}.fa-bus-alt::before{content:"\f55e"}.fa-eye::before{content:"\f06e"}.fa-face-sad-cry::before{content:"\f5b3"}.fa-sad-cry::before{content:"\f5b3"}.fa-audio-description::before{content:"\f29e"}.fa-person-military-to-person::before{content:"\e54c"}.fa-file-shield::before{content:"\e4f0"}.fa-user-slash::before{content:"\f506"}.fa-pen::before{content:"\f304"}.fa-tower-observation::before{content:"\e586"}.fa-file-code::before{content:"\f1c9"}.fa-signal::before{content:"\f012"}.fa-signal-5::before{content:"\f012"}.fa-signal-perfect::before{content:"\f012"}.fa-bus::before{content:"\f207"}.fa-heart-circle-xmark::before{content:"\e501"}.fa-house-chimney::before{content:"\e3af"}.fa-home-lg::before{content:"\e3af"}.fa-window-maximize::before{content:"\f2d0"}.fa-face-frown::before{content:"\f119"}.fa-frown::before{content:"\f119"}.fa-prescription::before{content:"\f5b1"}.fa-shop::before{content:"\f54f"}.fa-store-alt::before{content:"\f54f"}.fa-floppy-disk::before{content:"\f0c7"}.fa-save::before{content:"\f0c7"}.fa-vihara::before{content:"\f6a7"}.fa-scale-unbalanced::before{content:"\f515"}.fa-balance-scale-left::before{content:"\f515"}.fa-sort-up::before{content:"\f0de"}.fa-sort-asc::before{content:"\f0de"}.fa-comment-dots::before{content:"\f4ad"}.fa-commenting::before{content:"\f4ad"}.fa-plant-wilt::before{content:"\e5aa"}.fa-diamond::before{content:"\f219"}.fa-face-grin-squint::before{content:"\f585"}.fa-grin-squint::before{content:"\f585"}.fa-hand-holding-dollar::before{content:"\f4c0"}.fa-hand-holding-usd::before{content:"\f4c0"}.fa-bacterium::before{content:"\e05a"}.fa-hand-pointer::before{content:"\f25a"}.fa-drum-steelpan::before{content:"\f56a"}.fa-hand-scissors::before{content:"\f257"}.fa-hands-praying::before{content:"\f684"}.fa-praying-hands::before{content:"\f684"}.fa-arrow-rotate-right::before{content:"\f01e"}.fa-arrow-right-rotate::before{content:"\f01e"}.fa-arrow-rotate-forward::before{content:"\f01e"}.fa-redo::before{content:"\f01e"}.fa-biohazard::before{content:"\f780"}.fa-location-crosshairs::before{content:"\f601"}.fa-location::before{content:"\f601"}.fa-mars-double::before{content:"\f227"}.fa-child-dress::before{content:"\e59c"}.fa-users-between-lines::before{content:"\e591"}.fa-lungs-virus::before{content:"\e067"}.fa-face-grin-tears::before{content:"\f588"}.fa-grin-tears::before{content:"\f588"}.fa-phone::before{content:"\f095"}.fa-calendar-xmark::before{content:"\f273"}.fa-calendar-times::before{content:"\f273"}.fa-child-reaching::before{content:"\e59d"}.fa-head-side-virus::before{content:"\e064"}.fa-user-gear::before{content:"\f4fe"}.fa-user-cog::before{content:"\f4fe"}.fa-arrow-up-1-9::before{content:"\f163"}.fa-sort-numeric-up::before{content:"\f163"}.fa-door-closed::before{content:"\f52a"}.fa-shield-virus::before{content:"\e06c"}.fa-dice-six::before{content:"\f526"}.fa-mosquito-net::before{content:"\e52c"}.fa-bridge-water::before{content:"\e4ce"}.fa-person-booth::before{content:"\f756"}.fa-text-width::before{content:"\f035"}.fa-hat-wizard::before{content:"\f6e8"}.fa-pen-fancy::before{content:"\f5ac"}.fa-person-digging::before{content:"\f85e"}.fa-digging::before{content:"\f85e"}.fa-trash::before{content:"\f1f8"}.fa-gauge-simple::before{content:"\f629"}.fa-gauge-simple-med::before{content:"\f629"}.fa-tachometer-average::before{content:"\f629"}.fa-book-medical::before{content:"\f7e6"}.fa-poo::before{content:"\f2fe"}.fa-quote-right::before{content:"\f10e"}.fa-quote-right-alt::before{content:"\f10e"}.fa-shirt::before{content:"\f553"}.fa-t-shirt::before{content:"\f553"}.fa-tshirt::before{content:"\f553"}.fa-cubes::before{content:"\f1b3"}.fa-divide::before{content:"\f529"}.fa-tenge-sign::before{content:"\f7d7"}.fa-tenge::before{content:"\f7d7"}.fa-headphones::before{content:"\f025"}.fa-hands-holding::before{content:"\f4c2"}.fa-hands-clapping::before{content:"\e1a8"}.fa-republican::before{content:"\f75e"}.fa-arrow-left::before{content:"\f060"}.fa-person-circle-xmark::before{content:"\e543"}.fa-ruler::before{content:"\f545"}.fa-align-left::before{content:"\f036"}.fa-dice-d6::before{content:"\f6d1"}.fa-restroom::before{content:"\f7bd"}.fa-j::before{content:"\4a"}.fa-users-viewfinder::before{content:"\e595"}.fa-file-video::before{content:"\f1c8"}.fa-up-right-from-square::before{content:"\f35d"}.fa-external-link-alt::before{content:"\f35d"}.fa-table-cells::before{content:"\f00a"}.fa-th::before{content:"\f00a"}.fa-file-pdf::before{content:"\f1c1"}.fa-book-bible::before{content:"\f647"}.fa-bible::before{content:"\f647"}.fa-o::before{content:"\4f"}.fa-suitcase-medical::before{content:"\f0fa"}.fa-medkit::before{content:"\f0fa"}.fa-user-secret::before{content:"\f21b"}.fa-otter::before{content:"\f700"}.fa-person-dress::before{content:"\f182"}.fa-female::before{content:"\f182"}.fa-comment-dollar::before{content:"\f651"}.fa-business-time::before{content:"\f64a"}.fa-briefcase-clock::before{content:"\f64a"}.fa-table-cells-large::before{content:"\f009"}.fa-th-large::before{content:"\f009"}.fa-book-tanakh::before{content:"\f827"}.fa-tanakh::before{content:"\f827"}.fa-phone-volume::before{content:"\f2a0"}.fa-volume-control-phone::before{content:"\f2a0"}.fa-hat-cowboy-side::before{content:"\f8c1"}.fa-clipboard-user::before{content:"\f7f3"}.fa-child::before{content:"\f1ae"}.fa-lira-sign::before{content:"\f195"}.fa-satellite::before{content:"\f7bf"}.fa-plane-lock::before{content:"\e558"}.fa-tag::before{content:"\f02b"}.fa-comment::before{content:"\f075"}.fa-cake-candles::before{content:"\f1fd"}.fa-birthday-cake::before{content:"\f1fd"}.fa-cake::before{content:"\f1fd"}.fa-envelope::before{content:"\f0e0"}.fa-angles-up::before{content:"\f102"}.fa-angle-double-up::before{content:"\f102"}.fa-paperclip::before{content:"\f0c6"}.fa-arrow-right-to-city::before{content:"\e4b3"}.fa-ribbon::before{content:"\f4d6"}.fa-lungs::before{content:"\f604"}.fa-arrow-up-9-1::before{content:"\f887"}.fa-sort-numeric-up-alt::before{content:"\f887"}.fa-litecoin-sign::before{content:"\e1d3"}.fa-border-none::before{content:"\f850"}.fa-circle-nodes::before{content:"\e4e2"}.fa-parachute-box::before{content:"\f4cd"}.fa-indent::before{content:"\f03c"}.fa-truck-field-un::before{content:"\e58e"}.fa-hourglass::before{content:"\f254"}.fa-hourglass-empty::before{content:"\f254"}.fa-mountain::before{content:"\f6fc"}.fa-user-doctor::before{content:"\f0f0"}.fa-user-md::before{content:"\f0f0"}.fa-circle-info::before{content:"\f05a"}.fa-info-circle::before{content:"\f05a"}.fa-cloud-meatball::before{content:"\f73b"}.fa-camera::before{content:"\f030"}.fa-camera-alt::before{content:"\f030"}.fa-square-virus::before{content:"\e578"}.fa-meteor::before{content:"\f753"}.fa-car-on::before{content:"\e4dd"}.fa-sleigh::before{content:"\f7cc"}.fa-arrow-down-1-9::before{content:"\f162"}.fa-sort-numeric-asc::before{content:"\f162"}.fa-sort-numeric-down::before{content:"\f162"}.fa-hand-holding-droplet::before{content:"\f4c1"}.fa-hand-holding-water::before{content:"\f4c1"}.fa-water::before{content:"\f773"}.fa-calendar-check::before{content:"\f274"}.fa-braille::before{content:"\f2a1"}.fa-prescription-bottle-medical::before{content:"\f486"}.fa-prescription-bottle-alt::before{content:"\f486"}.fa-landmark::before{content:"\f66f"}.fa-truck::before{content:"\f0d1"}.fa-crosshairs::before{content:"\f05b"}.fa-person-cane::before{content:"\e53c"}.fa-tent::before{content:"\e57d"}.fa-vest-patches::before{content:"\e086"}.fa-check-double::before{content:"\f560"}.fa-arrow-down-a-z::before{content:"\f15d"}.fa-sort-alpha-asc::before{content:"\f15d"}.fa-sort-alpha-down::before{content:"\f15d"}.fa-money-bill-wheat::before{content:"\e52a"}.fa-cookie::before{content:"\f563"}.fa-arrow-rotate-left::before{content:"\f0e2"}.fa-arrow-left-rotate::before{content:"\f0e2"}.fa-arrow-rotate-back::before{content:"\f0e2"}.fa-arrow-rotate-backward::before{content:"\f0e2"}.fa-undo::before{content:"\f0e2"}.fa-hard-drive::before{content:"\f0a0"}.fa-hdd::before{content:"\f0a0"}.fa-face-grin-squint-tears::before{content:"\f586"}.fa-grin-squint-tears::before{content:"\f586"}.fa-dumbbell::before{content:"\f44b"}.fa-rectangle-list::before{content:"\f022"}.fa-list-alt::before{content:"\f022"}.fa-tarp-droplet::before{content:"\e57c"}.fa-house-medical-circle-check::before{content:"\e511"}.fa-person-skiing-nordic::before{content:"\f7ca"}.fa-skiing-nordic::before{content:"\f7ca"}.fa-calendar-plus::before{content:"\f271"}.fa-plane-arrival::before{content:"\f5af"}.fa-circle-left::before{content:"\f359"}.fa-arrow-alt-circle-left::before{content:"\f359"}.fa-train-subway::before{content:"\f239"}.fa-subway::before{content:"\f239"}.fa-chart-gantt::before{content:"\e0e4"}.fa-indian-rupee-sign::before{content:"\e1bc"}.fa-indian-rupee::before{content:"\e1bc"}.fa-inr::before{content:"\e1bc"}.fa-crop-simple::before{content:"\f565"}.fa-crop-alt::before{content:"\f565"}.fa-money-bill-1::before{content:"\f3d1"}.fa-money-bill-alt::before{content:"\f3d1"}.fa-left-long::before{content:"\f30a"}.fa-long-arrow-alt-left::before{content:"\f30a"}.fa-dna::before{content:"\f471"}.fa-virus-slash::before{content:"\e075"}.fa-minus::before{content:"\f068"}.fa-subtract::before{content:"\f068"}.fa-chess::before{content:"\f439"}.fa-arrow-left-long::before{content:"\f177"}.fa-long-arrow-left::before{content:"\f177"}.fa-plug-circle-check::before{content:"\e55c"}.fa-street-view::before{content:"\f21d"}.fa-franc-sign::before{content:"\e18f"}.fa-volume-off::before{content:"\f026"}.fa-hands-asl-interpreting::before{content:"\f2a3"}.fa-american-sign-language-interpreting::before{content:"\f2a3"}.fa-asl-interpreting::before{content:"\f2a3"}.fa-hands-american-sign-language-interpreting::before{content:"\f2a3"}.fa-gear::before{content:"\f013"}.fa-cog::before{content:"\f013"}.fa-droplet-slash::before{content:"\f5c7"}.fa-tint-slash::before{content:"\f5c7"}.fa-mosque::before{content:"\f678"}.fa-mosquito::before{content:"\e52b"}.fa-star-of-david::before{content:"\f69a"}.fa-person-military-rifle::before{content:"\e54b"}.fa-cart-shopping::before{content:"\f07a"}.fa-shopping-cart::before{content:"\f07a"}.fa-vials::before{content:"\f493"}.fa-plug-circle-plus::before{content:"\e55f"}.fa-place-of-worship::before{content:"\f67f"}.fa-grip-vertical::before{content:"\f58e"}.fa-arrow-turn-up::before{content:"\f148"}.fa-level-up::before{content:"\f148"}.fa-u::before{content:"\55"}.fa-square-root-variable::before{content:"\f698"}.fa-square-root-alt::before{content:"\f698"}.fa-clock::before{content:"\f017"}.fa-clock-four::before{content:"\f017"}.fa-backward-step::before{content:"\f048"}.fa-step-backward::before{content:"\f048"}.fa-pallet::before{content:"\f482"}.fa-faucet::before{content:"\e005"}.fa-baseball-bat-ball::before{content:"\f432"}.fa-s::before{content:"\53"}.fa-timeline::before{content:"\e29c"}.fa-keyboard::before{content:"\f11c"}.fa-caret-down::before{content:"\f0d7"}.fa-house-chimney-medical::before{content:"\f7f2"}.fa-clinic-medical::before{content:"\f7f2"}.fa-temperature-three-quarters::before{content:"\f2c8"}.fa-temperature-3::before{content:"\f2c8"}.fa-thermometer-3::before{content:"\f2c8"}.fa-thermometer-three-quarters::before{content:"\f2c8"}.fa-mobile-screen::before{content:"\f3cf"}.fa-mobile-android-alt::before{content:"\f3cf"}.fa-plane-up::before{content:"\e22d"}.fa-piggy-bank::before{content:"\f4d3"}.fa-battery-half::before{content:"\f242"}.fa-battery-3::before{content:"\f242"}.fa-mountain-city::before{content:"\e52e"}.fa-coins::before{content:"\f51e"}.fa-khanda::before{content:"\f66d"}.fa-sliders::before{content:"\f1de"}.fa-sliders-h::before{content:"\f1de"}.fa-folder-tree::before{content:"\f802"}.fa-network-wired::before{content:"\f6ff"}.fa-map-pin::before{content:"\f276"}.fa-hamsa::before{content:"\f665"}.fa-cent-sign::before{content:"\e3f5"}.fa-flask::before{content:"\f0c3"}.fa-person-pregnant::before{content:"\e31e"}.fa-wand-sparkles::before{content:"\f72b"}.fa-ellipsis-vertical::before{content:"\f142"}.fa-ellipsis-v::before{content:"\f142"}.fa-ticket::before{content:"\f145"}.fa-power-off::before{content:"\f011"}.fa-right-long::before{content:"\f30b"}.fa-long-arrow-alt-right::before{content:"\f30b"}.fa-flag-usa::before{content:"\f74d"}.fa-laptop-file::before{content:"\e51d"}.fa-tty::before{content:"\f1e4"}.fa-teletype::before{content:"\f1e4"}.fa-diagram-next::before{content:"\e476"}.fa-person-rifle::before{content:"\e54e"}.fa-house-medical-circle-exclamation::before{content:"\e512"}.fa-closed-captioning::before{content:"\f20a"}.fa-person-hiking::before{content:"\f6ec"}.fa-hiking::before{content:"\f6ec"}.fa-venus-double::before{content:"\f226"}.fa-images::before{content:"\f302"}.fa-calculator::before{content:"\f1ec"}.fa-people-pulling::before{content:"\e535"}.fa-n::before{content:"\4e"}.fa-cable-car::before{content:"\f7da"}.fa-tram::before{content:"\f7da"}.fa-cloud-rain::before{content:"\f73d"}.fa-building-circle-xmark::before{content:"\e4d4"}.fa-ship::before{content:"\f21a"}.fa-arrows-down-to-line::before{content:"\e4b8"}.fa-download::before{content:"\f019"}.fa-face-grin::before{content:"\f580"}.fa-grin::before{content:"\f580"}.fa-delete-left::before{content:"\f55a"}.fa-backspace::before{content:"\f55a"}.fa-eye-dropper::before{content:"\f1fb"}.fa-eye-dropper-empty::before{content:"\f1fb"}.fa-eyedropper::before{content:"\f1fb"}.fa-file-circle-check::before{content:"\e5a0"}.fa-forward::before{content:"\f04e"}.fa-mobile::before{content:"\f3ce"}.fa-mobile-android::before{content:"\f3ce"}.fa-mobile-phone::before{content:"\f3ce"}.fa-face-meh::before{content:"\f11a"}.fa-meh::before{content:"\f11a"}.fa-align-center::before{content:"\f037"}.fa-book-skull::before{content:"\f6b7"}.fa-book-dead::before{content:"\f6b7"}.fa-id-card::before{content:"\f2c2"}.fa-drivers-license::before{content:"\f2c2"}.fa-outdent::before{content:"\f03b"}.fa-dedent::before{content:"\f03b"}.fa-heart-circle-exclamation::before{content:"\e4fe"}.fa-house::before{content:"\f015"}.fa-home::before{content:"\f015"}.fa-home-alt::before{content:"\f015"}.fa-home-lg-alt::before{content:"\f015"}.fa-calendar-week::before{content:"\f784"}.fa-laptop-medical::before{content:"\f812"}.fa-b::before{content:"\42"}.fa-file-medical::before{content:"\f477"}.fa-dice-one::before{content:"\f525"}.fa-kiwi-bird::before{content:"\f535"}.fa-arrow-right-arrow-left::before{content:"\f0ec"}.fa-exchange::before{content:"\f0ec"}.fa-rotate-right::before{content:"\f2f9"}.fa-redo-alt::before{content:"\f2f9"}.fa-rotate-forward::before{content:"\f2f9"}.fa-utensils::before{content:"\f2e7"}.fa-cutlery::before{content:"\f2e7"}.fa-arrow-up-wide-short::before{content:"\f161"}.fa-sort-amount-up::before{content:"\f161"}.fa-mill-sign::before{content:"\e1ed"}.fa-bowl-rice::before{content:"\e2eb"}.fa-skull::before{content:"\f54c"}.fa-tower-broadcast::before{content:"\f519"}.fa-broadcast-tower::before{content:"\f519"}.fa-truck-pickup::before{content:"\f63c"}.fa-up-long::before{content:"\f30c"}.fa-long-arrow-alt-up::before{content:"\f30c"}.fa-stop::before{content:"\f04d"}.fa-code-merge::before{content:"\f387"}.fa-upload::before{content:"\f093"}.fa-hurricane::before{content:"\f751"}.fa-mound::before{content:"\e52d"}.fa-toilet-portable::before{content:"\e583"}.fa-compact-disc::before{content:"\f51f"}.fa-file-arrow-down::before{content:"\f56d"}.fa-file-download::before{content:"\f56d"}.fa-caravan::before{content:"\f8ff"}.fa-shield-cat::before{content:"\e572"}.fa-bolt::before{content:"\f0e7"}.fa-zap::before{content:"\f0e7"}.fa-glass-water::before{content:"\e4f4"}.fa-oil-well::before{content:"\e532"}.fa-vault::before{content:"\e2c5"}.fa-mars::before{content:"\f222"}.fa-toilet::before{content:"\f7d8"}.fa-plane-circle-xmark::before{content:"\e557"}.fa-yen-sign::before{content:"\f157"}.fa-cny::before{content:"\f157"}.fa-jpy::before{content:"\f157"}.fa-rmb::before{content:"\f157"}.fa-yen::before{content:"\f157"}.fa-ruble-sign::before{content:"\f158"}.fa-rouble::before{content:"\f158"}.fa-rub::before{content:"\f158"}.fa-ruble::before{content:"\f158"}.fa-sun::before{content:"\f185"}.fa-guitar::before{content:"\f7a6"}.fa-face-laugh-wink::before{content:"\f59c"}.fa-laugh-wink::before{content:"\f59c"}.fa-horse-head::before{content:"\f7ab"}.fa-bore-hole::before{content:"\e4c3"}.fa-industry::before{content:"\f275"}.fa-circle-down::before{content:"\f358"}.fa-arrow-alt-circle-down::before{content:"\f358"}.fa-arrows-turn-to-dots::before{content:"\e4c1"}.fa-florin-sign::before{content:"\e184"}.fa-arrow-down-short-wide::before{content:"\f884"}.fa-sort-amount-desc::before{content:"\f884"}.fa-sort-amount-down-alt::before{content:"\f884"}.fa-less-than::before{content:"\3c"}.fa-angle-down::before{content:"\f107"}.fa-car-tunnel::before{content:"\e4de"}.fa-head-side-cough::before{content:"\e061"}.fa-grip-lines::before{content:"\f7a4"}.fa-thumbs-down::before{content:"\f165"}.fa-user-lock::before{content:"\f502"}.fa-arrow-right-long::before{content:"\f178"}.fa-long-arrow-right::before{content:"\f178"}.fa-anchor-circle-xmark::before{content:"\e4ac"}.fa-ellipsis::before{content:"\f141"}.fa-ellipsis-h::before{content:"\f141"}.fa-chess-pawn::before{content:"\f443"}.fa-kit-medical::before{content:"\f479"}.fa-first-aid::before{content:"\f479"}.fa-person-through-window::before{content:"\e5a9"}.fa-toolbox::before{content:"\f552"}.fa-hands-holding-circle::before{content:"\e4fb"}.fa-bug::before{content:"\f188"}.fa-credit-card::before{content:"\f09d"}.fa-credit-card-alt::before{content:"\f09d"}.fa-car::before{content:"\f1b9"}.fa-automobile::before{content:"\f1b9"}.fa-hand-holding-hand::before{content:"\e4f7"}.fa-book-open-reader::before{content:"\f5da"}.fa-book-reader::before{content:"\f5da"}.fa-mountain-sun::before{content:"\e52f"}.fa-arrows-left-right-to-line::before{content:"\e4ba"}.fa-dice-d20::before{content:"\f6cf"}.fa-truck-droplet::before{content:"\e58c"}.fa-file-circle-xmark::before{content:"\e5a1"}.fa-temperature-arrow-up::before{content:"\e040"}.fa-temperature-up::before{content:"\e040"}.fa-medal::before{content:"\f5a2"}.fa-bed::before{content:"\f236"}.fa-square-h::before{content:"\f0fd"}.fa-h-square::before{content:"\f0fd"}.fa-podcast::before{content:"\f2ce"}.fa-temperature-full::before{content:"\f2c7"}.fa-temperature-4::before{content:"\f2c7"}.fa-thermometer-4::before{content:"\f2c7"}.fa-thermometer-full::before{content:"\f2c7"}.fa-bell::before{content:"\f0f3"}.fa-superscript::before{content:"\f12b"}.fa-plug-circle-xmark::before{content:"\e560"}.fa-star-of-life::before{content:"\f621"}.fa-phone-slash::before{content:"\f3dd"}.fa-paint-roller::before{content:"\f5aa"}.fa-handshake-angle::before{content:"\f4c4"}.fa-hands-helping::before{content:"\f4c4"}.fa-location-dot::before{content:"\f3c5"}.fa-map-marker-alt::before{content:"\f3c5"}.fa-file::before{content:"\f15b"}.fa-greater-than::before{content:"\3e"}.fa-person-swimming::before{content:"\f5c4"}.fa-swimmer::before{content:"\f5c4"}.fa-arrow-down::before{content:"\f063"}.fa-droplet::before{content:"\f043"}.fa-tint::before{content:"\f043"}.fa-eraser::before{content:"\f12d"}.fa-earth-americas::before{content:"\f57d"}.fa-earth::before{content:"\f57d"}.fa-earth-america::before{content:"\f57d"}.fa-globe-americas::before{content:"\f57d"}.fa-person-burst::before{content:"\e53b"}.fa-dove::before{content:"\f4ba"}.fa-battery-empty::before{content:"\f244"}.fa-battery-0::before{content:"\f244"}.fa-socks::before{content:"\f696"}.fa-inbox::before{content:"\f01c"}.fa-section::before{content:"\e447"}.fa-gauge-high::before{content:"\f625"}.fa-tachometer-alt::before{content:"\f625"}.fa-tachometer-alt-fast::before{content:"\f625"}.fa-envelope-open-text::before{content:"\f658"}.fa-hospital::before{content:"\f0f8"}.fa-hospital-alt::before{content:"\f0f8"}.fa-hospital-wide::before{content:"\f0f8"}.fa-wine-bottle::before{content:"\f72f"}.fa-chess-rook::before{content:"\f447"}.fa-bars-staggered::before{content:"\f550"}.fa-reorder::before{content:"\f550"}.fa-stream::before{content:"\f550"}.fa-dharmachakra::before{content:"\f655"}.fa-hotdog::before{content:"\f80f"}.fa-person-walking-with-cane::before{content:"\f29d"}.fa-blind::before{content:"\f29d"}.fa-drum::before{content:"\f569"}.fa-ice-cream::before{content:"\f810"}.fa-heart-circle-bolt::before{content:"\e4fc"}.fa-fax::before{content:"\f1ac"}.fa-paragraph::before{content:"\f1dd"}.fa-check-to-slot::before{content:"\f772"}.fa-vote-yea::before{content:"\f772"}.fa-star-half::before{content:"\f089"}.fa-boxes-stacked::before{content:"\f468"}.fa-boxes::before{content:"\f468"}.fa-boxes-alt::before{content:"\f468"}.fa-link::before{content:"\f0c1"}.fa-chain::before{content:"\f0c1"}.fa-ear-listen::before{content:"\f2a2"}.fa-assistive-listening-systems::before{content:"\f2a2"}.fa-tree-city::before{content:"\e587"}.fa-play::before{content:"\f04b"}.fa-font::before{content:"\f031"}.fa-rupiah-sign::before{content:"\e23d"}.fa-magnifying-glass::before{content:"\f002"}.fa-search::before{content:"\f002"}.fa-table-tennis-paddle-ball::before{content:"\f45d"}.fa-ping-pong-paddle-ball::before{content:"\f45d"}.fa-table-tennis::before{content:"\f45d"}.fa-person-dots-from-line::before{content:"\f470"}.fa-diagnoses::before{content:"\f470"}.fa-trash-can-arrow-up::before{content:"\f82a"}.fa-trash-restore-alt::before{content:"\f82a"}.fa-naira-sign::before{content:"\e1f6"}.fa-cart-arrow-down::before{content:"\f218"}.fa-walkie-talkie::before{content:"\f8ef"}.fa-file-pen::before{content:"\f31c"}.fa-file-edit::before{content:"\f31c"}.fa-receipt::before{content:"\f543"}.fa-square-pen::before{content:"\f14b"}.fa-pen-square::before{content:"\f14b"}.fa-pencil-square::before{content:"\f14b"}.fa-suitcase-rolling::before{content:"\f5c1"}.fa-person-circle-exclamation::before{content:"\e53f"}.fa-chevron-down::before{content:"\f078"}.fa-battery-full::before{content:"\f240"}.fa-battery::before{content:"\f240"}.fa-battery-5::before{content:"\f240"}.fa-skull-crossbones::before{content:"\f714"}.fa-code-compare::before{content:"\e13a"}.fa-list-ul::before{content:"\f0ca"}.fa-list-dots::before{content:"\f0ca"}.fa-school-lock::before{content:"\e56f"}.fa-tower-cell::before{content:"\e585"}.fa-down-long::before{content:"\f309"}.fa-long-arrow-alt-down::before{content:"\f309"}.fa-ranking-star::before{content:"\e561"}.fa-chess-king::before{content:"\f43f"}.fa-person-harassing::before{content:"\e549"}.fa-brazilian-real-sign::before{content:"\e46c"}.fa-landmark-dome::before{content:"\f752"}.fa-landmark-alt::before{content:"\f752"}.fa-arrow-up::before{content:"\f062"}.fa-tv::before{content:"\f26c"}.fa-television::before{content:"\f26c"}.fa-tv-alt::before{content:"\f26c"}.fa-shrimp::before{content:"\e448"}.fa-list-check::before{content:"\f0ae"}.fa-tasks::before{content:"\f0ae"}.fa-jug-detergent::before{content:"\e519"}.fa-circle-user::before{content:"\f2bd"}.fa-user-circle::before{content:"\f2bd"}.fa-user-shield::before{content:"\f505"}.fa-wind::before{content:"\f72e"}.fa-car-burst::before{content:"\f5e1"}.fa-car-crash::before{content:"\f5e1"}.fa-y::before{content:"\59"}.fa-person-snowboarding::before{content:"\f7ce"}.fa-snowboarding::before{content:"\f7ce"}.fa-truck-fast::before{content:"\f48b"}.fa-shipping-fast::before{content:"\f48b"}.fa-fish::before{content:"\f578"}.fa-user-graduate::before{content:"\f501"}.fa-circle-half-stroke::before{content:"\f042"}.fa-adjust::before{content:"\f042"}.fa-clapperboard::before{content:"\e131"}.fa-circle-radiation::before{content:"\f7ba"}.fa-radiation-alt::before{content:"\f7ba"}.fa-baseball::before{content:"\f433"}.fa-baseball-ball::before{content:"\f433"}.fa-jet-fighter-up::before{content:"\e518"}.fa-diagram-project::before{content:"\f542"}.fa-project-diagram::before{content:"\f542"}.fa-copy::before{content:"\f0c5"}.fa-volume-xmark::before{content:"\f6a9"}.fa-volume-mute::before{content:"\f6a9"}.fa-volume-times::before{content:"\f6a9"}.fa-hand-sparkles::before{content:"\e05d"}.fa-grip::before{content:"\f58d"}.fa-grip-horizontal::before{content:"\f58d"}.fa-share-from-square::before{content:"\f14d"}.fa-share-square::before{content:"\f14d"}.fa-child-combatant::before{content:"\e4e0"}.fa-child-rifle::before{content:"\e4e0"}.fa-gun::before{content:"\e19b"}.fa-square-phone::before{content:"\f098"}.fa-phone-square::before{content:"\f098"}.fa-plus::before{content:"\2b"}.fa-add::before{content:"\2b"}.fa-expand::before{content:"\f065"}.fa-computer::before{content:"\e4e5"}.fa-xmark::before{content:"\f00d"}.fa-close::before{content:"\f00d"}.fa-multiply::before{content:"\f00d"}.fa-remove::before{content:"\f00d"}.fa-times::before{content:"\f00d"}.fa-arrows-up-down-left-right::before{content:"\f047"}.fa-arrows::before{content:"\f047"}.fa-chalkboard-user::before{content:"\f51c"}.fa-chalkboard-teacher::before{content:"\f51c"}.fa-peso-sign::before{content:"\e222"}.fa-building-shield::before{content:"\e4d8"}.fa-baby::before{content:"\f77c"}.fa-users-line::before{content:"\e592"}.fa-quote-left::before{content:"\f10d"}.fa-quote-left-alt::before{content:"\f10d"}.fa-tractor::before{content:"\f722"}.fa-trash-arrow-up::before{content:"\f829"}.fa-trash-restore::before{content:"\f829"}.fa-arrow-down-up-lock::before{content:"\e4b0"}.fa-lines-leaning::before{content:"\e51e"}.fa-ruler-combined::before{content:"\f546"}.fa-copyright::before{content:"\f1f9"}.fa-equals::before{content:"\3d"}.fa-blender::before{content:"\f517"}.fa-teeth::before{content:"\f62e"}.fa-shekel-sign::before{content:"\f20b"}.fa-ils::before{content:"\f20b"}.fa-shekel::before{content:"\f20b"}.fa-sheqel::before{content:"\f20b"}.fa-sheqel-sign::before{content:"\f20b"}.fa-map::before{content:"\f279"}.fa-rocket::before{content:"\f135"}.fa-photo-film::before{content:"\f87c"}.fa-photo-video::before{content:"\f87c"}.fa-folder-minus::before{content:"\f65d"}.fa-store::before{content:"\f54e"}.fa-arrow-trend-up::before{content:"\e098"}.fa-plug-circle-minus::before{content:"\e55e"}.fa-sign-hanging::before{content:"\f4d9"}.fa-sign::before{content:"\f4d9"}.fa-bezier-curve::before{content:"\f55b"}.fa-bell-slash::before{content:"\f1f6"}.fa-tablet::before{content:"\f3fb"}.fa-tablet-android::before{content:"\f3fb"}.fa-school-flag::before{content:"\e56e"}.fa-fill::before{content:"\f575"}.fa-angle-up::before{content:"\f106"}.fa-drumstick-bite::before{content:"\f6d7"}.fa-holly-berry::before{content:"\f7aa"}.fa-chevron-left::before{content:"\f053"}.fa-bacteria::before{content:"\e059"}.fa-hand-lizard::before{content:"\f258"}.fa-notdef::before{content:"\e1fe"}.fa-disease::before{content:"\f7fa"}.fa-briefcase-medical::before{content:"\f469"}.fa-genderless::before{content:"\f22d"}.fa-chevron-right::before{content:"\f054"}.fa-retweet::before{content:"\f079"}.fa-car-rear::before{content:"\f5de"}.fa-car-alt::before{content:"\f5de"}.fa-pump-soap::before{content:"\e06b"}.fa-video-slash::before{content:"\f4e2"}.fa-battery-quarter::before{content:"\f243"}.fa-battery-2::before{content:"\f243"}.fa-radio::before{content:"\f8d7"}.fa-baby-carriage::before{content:"\f77d"}.fa-carriage-baby::before{content:"\f77d"}.fa-traffic-light::before{content:"\f637"}.fa-thermometer::before{content:"\f491"}.fa-vr-cardboard::before{content:"\f729"}.fa-hand-middle-finger::before{content:"\f806"}.fa-percent::before{content:"\25"}.fa-percentage::before{content:"\25"}.fa-truck-moving::before{content:"\f4df"}.fa-glass-water-droplet::before{content:"\e4f5"}.fa-display::before{content:"\e163"}.fa-face-smile::before{content:"\f118"}.fa-smile::before{content:"\f118"}.fa-thumbtack::before{content:"\f08d"}.fa-thumb-tack::before{content:"\f08d"}.fa-trophy::before{content:"\f091"}.fa-person-praying::before{content:"\f683"}.fa-pray::before{content:"\f683"}.fa-hammer::before{content:"\f6e3"}.fa-hand-peace::before{content:"\f25b"}.fa-rotate::before{content:"\f2f1"}.fa-sync-alt::before{content:"\f2f1"}.fa-spinner::before{content:"\f110"}.fa-robot::before{content:"\f544"}.fa-peace::before{content:"\f67c"}.fa-gears::before{content:"\f085"}.fa-cogs::before{content:"\f085"}.fa-warehouse::before{content:"\f494"}.fa-arrow-up-right-dots::before{content:"\e4b7"}.fa-splotch::before{content:"\f5bc"}.fa-face-grin-hearts::before{content:"\f584"}.fa-grin-hearts::before{content:"\f584"}.fa-dice-four::before{content:"\f524"}.fa-sim-card::before{content:"\f7c4"}.fa-transgender::before{content:"\f225"}.fa-transgender-alt::before{content:"\f225"}.fa-mercury::before{content:"\f223"}.fa-arrow-turn-down::before{content:"\f149"}.fa-level-down::before{content:"\f149"}.fa-person-falling-burst::before{content:"\e547"}.fa-award::before{content:"\f559"}.fa-ticket-simple::before{content:"\f3ff"}.fa-ticket-alt::before{content:"\f3ff"}.fa-building::before{content:"\f1ad"}.fa-angles-left::before{content:"\f100"}.fa-angle-double-left::before{content:"\f100"}.fa-qrcode::before{content:"\f029"}.fa-clock-rotate-left::before{content:"\f1da"}.fa-history::before{content:"\f1da"}.fa-face-grin-beam-sweat::before{content:"\f583"}.fa-grin-beam-sweat::before{content:"\f583"}.fa-file-export::before{content:"\f56e"}.fa-arrow-right-from-file::before{content:"\f56e"}.fa-shield::before{content:"\f132"}.fa-shield-blank::before{content:"\f132"}.fa-arrow-up-short-wide::before{content:"\f885"}.fa-sort-amount-up-alt::before{content:"\f885"}.fa-house-medical::before{content:"\e3b2"}.fa-golf-ball-tee::before{content:"\f450"}.fa-golf-ball::before{content:"\f450"}.fa-circle-chevron-left::before{content:"\f137"}.fa-chevron-circle-left::before{content:"\f137"}.fa-house-chimney-window::before{content:"\e00d"}.fa-pen-nib::before{content:"\f5ad"}.fa-tent-arrow-turn-left::before{content:"\e580"}.fa-tents::before{content:"\e582"}.fa-wand-magic::before{content:"\f0d0"}.fa-magic::before{content:"\f0d0"}.fa-dog::before{content:"\f6d3"}.fa-carrot::before{content:"\f787"}.fa-moon::before{content:"\f186"}.fa-wine-glass-empty::before{content:"\f5ce"}.fa-wine-glass-alt::before{content:"\f5ce"}.fa-cheese::before{content:"\f7ef"}.fa-yin-yang::before{content:"\f6ad"}.fa-music::before{content:"\f001"}.fa-code-commit::before{content:"\f386"}.fa-temperature-low::before{content:"\f76b"}.fa-person-biking::before{content:"\f84a"}.fa-biking::before{content:"\f84a"}.fa-broom::before{content:"\f51a"}.fa-shield-heart::before{content:"\e574"}.fa-gopuram::before{content:"\f664"}.fa-earth-oceania::before{content:"\e47b"}.fa-globe-oceania::before{content:"\e47b"}.fa-square-xmark::before{content:"\f2d3"}.fa-times-square::before{content:"\f2d3"}.fa-xmark-square::before{content:"\f2d3"}.fa-hashtag::before{content:"\23"}.fa-up-right-and-down-left-from-center::before{content:"\f424"}.fa-expand-alt::before{content:"\f424"}.fa-oil-can::before{content:"\f613"}.fa-t::before{content:"\54"}.fa-hippo::before{content:"\f6ed"}.fa-chart-column::before{content:"\e0e3"}.fa-infinity::before{content:"\f534"}.fa-vial-circle-check::before{content:"\e596"}.fa-person-arrow-down-to-line::before{content:"\e538"}.fa-voicemail::before{content:"\f897"}.fa-fan::before{content:"\f863"}.fa-person-walking-luggage::before{content:"\e554"}.fa-up-down::before{content:"\f338"}.fa-arrows-alt-v::before{content:"\f338"}.fa-cloud-moon-rain::before{content:"\f73c"}.fa-calendar::before{content:"\f133"}.fa-trailer::before{content:"\e041"}.fa-bahai::before{content:"\f666"}.fa-haykal::before{content:"\f666"}.fa-sd-card::before{content:"\f7c2"}.fa-dragon::before{content:"\f6d5"}.fa-shoe-prints::before{content:"\f54b"}.fa-circle-plus::before{content:"\f055"}.fa-plus-circle::before{content:"\f055"}.fa-face-grin-tongue-wink::before{content:"\f58b"}.fa-grin-tongue-wink::before{content:"\f58b"}.fa-hand-holding::before{content:"\f4bd"}.fa-plug-circle-exclamation::before{content:"\e55d"}.fa-link-slash::before{content:"\f127"}.fa-chain-broken::before{content:"\f127"}.fa-chain-slash::before{content:"\f127"}.fa-unlink::before{content:"\f127"}.fa-clone::before{content:"\f24d"}.fa-person-walking-arrow-loop-left::before{content:"\e551"}.fa-arrow-up-z-a::before{content:"\f882"}.fa-sort-alpha-up-alt::before{content:"\f882"}.fa-fire-flame-curved::before{content:"\f7e4"}.fa-fire-alt::before{content:"\f7e4"}.fa-tornado::before{content:"\f76f"}.fa-file-circle-plus::before{content:"\e494"}.fa-book-quran::before{content:"\f687"}.fa-quran::before{content:"\f687"}.fa-anchor::before{content:"\f13d"}.fa-border-all::before{content:"\f84c"}.fa-face-angry::before{content:"\f556"}.fa-angry::before{content:"\f556"}.fa-cookie-bite::before{content:"\f564"}.fa-arrow-trend-down::before{content:"\e097"}.fa-rss::before{content:"\f09e"}.fa-feed::before{content:"\f09e"}.fa-draw-polygon::before{content:"\f5ee"}.fa-scale-balanced::before{content:"\f24e"}.fa-balance-scale::before{content:"\f24e"}.fa-gauge-simple-high::before{content:"\f62a"}.fa-tachometer::before{content:"\f62a"}.fa-tachometer-fast::before{content:"\f62a"}.fa-shower::before{content:"\f2cc"}.fa-desktop::before{content:"\f390"}.fa-desktop-alt::before{content:"\f390"}.fa-m::before{content:"\4d"}.fa-table-list::before{content:"\f00b"}.fa-th-list::before{content:"\f00b"}.fa-comment-sms::before{content:"\f7cd"}.fa-sms::before{content:"\f7cd"}.fa-book::before{content:"\f02d"}.fa-user-plus::before{content:"\f234"}.fa-check::before{content:"\f00c"}.fa-battery-three-quarters::before{content:"\f241"}.fa-battery-4::before{content:"\f241"}.fa-house-circle-check::before{content:"\e509"}.fa-angle-left::before{content:"\f104"}.fa-diagram-successor::before{content:"\e47a"}.fa-truck-arrow-right::before{content:"\e58b"}.fa-arrows-split-up-and-left::before{content:"\e4bc"}.fa-hand-fist::before{content:"\f6de"}.fa-fist-raised::before{content:"\f6de"}.fa-cloud-moon::before{content:"\f6c3"}.fa-briefcase::before{content:"\f0b1"}.fa-person-falling::before{content:"\e546"}.fa-image-portrait::before{content:"\f3e0"}.fa-portrait::before{content:"\f3e0"}.fa-user-tag::before{content:"\f507"}.fa-rug::before{content:"\e569"}.fa-earth-europe::before{content:"\f7a2"}.fa-globe-europe::before{content:"\f7a2"}.fa-cart-flatbed-suitcase::before{content:"\f59d"}.fa-luggage-cart::before{content:"\f59d"}.fa-rectangle-xmark::before{content:"\f410"}.fa-rectangle-times::before{content:"\f410"}.fa-times-rectangle::before{content:"\f410"}.fa-window-close::before{content:"\f410"}.fa-baht-sign::before{content:"\e0ac"}.fa-book-open::before{content:"\f518"}.fa-book-journal-whills::before{content:"\f66a"}.fa-journal-whills::before{content:"\f66a"}.fa-handcuffs::before{content:"\e4f8"}.fa-triangle-exclamation::before{content:"\f071"}.fa-exclamation-triangle::before{content:"\f071"}.fa-warning::before{content:"\f071"}.fa-database::before{content:"\f1c0"}.fa-share::before{content:"\f064"}.fa-mail-forward::before{content:"\f064"}.fa-bottle-droplet::before{content:"\e4c4"}.fa-mask-face::before{content:"\e1d7"}.fa-hill-rockslide::before{content:"\e508"}.fa-right-left::before{content:"\f362"}.fa-exchange-alt::before{content:"\f362"}.fa-paper-plane::before{content:"\f1d8"}.fa-road-circle-exclamation::before{content:"\e565"}.fa-dungeon::before{content:"\f6d9"}.fa-align-right::before{content:"\f038"}.fa-money-bill-1-wave::before{content:"\f53b"}.fa-money-bill-wave-alt::before{content:"\f53b"}.fa-life-ring::before{content:"\f1cd"}.fa-hands::before{content:"\f2a7"}.fa-sign-language::before{content:"\f2a7"}.fa-signing::before{content:"\f2a7"}.fa-calendar-day::before{content:"\f783"}.fa-water-ladder::before{content:"\f5c5"}.fa-ladder-water::before{content:"\f5c5"}.fa-swimming-pool::before{content:"\f5c5"}.fa-arrows-up-down::before{content:"\f07d"}.fa-arrows-v::before{content:"\f07d"}.fa-face-grimace::before{content:"\f57f"}.fa-grimace::before{content:"\f57f"}.fa-wheelchair-move::before{content:"\e2ce"}.fa-wheelchair-alt::before{content:"\e2ce"}.fa-turn-down::before{content:"\f3be"}.fa-level-down-alt::before{content:"\f3be"}.fa-person-walking-arrow-right::before{content:"\e552"}.fa-square-envelope::before{content:"\f199"}.fa-envelope-square::before{content:"\f199"}.fa-dice::before{content:"\f522"}.fa-bowling-ball::before{content:"\f436"}.fa-brain::before{content:"\f5dc"}.fa-bandage::before{content:"\f462"}.fa-band-aid::before{content:"\f462"}.fa-calendar-minus::before{content:"\f272"}.fa-circle-xmark::before{content:"\f057"}.fa-times-circle::before{content:"\f057"}.fa-xmark-circle::before{content:"\f057"}.fa-gifts::before{content:"\f79c"}.fa-hotel::before{content:"\f594"}.fa-earth-asia::before{content:"\f57e"}.fa-globe-asia::before{content:"\f57e"}.fa-id-card-clip::before{content:"\f47f"}.fa-id-card-alt::before{content:"\f47f"}.fa-magnifying-glass-plus::before{content:"\f00e"}.fa-search-plus::before{content:"\f00e"}.fa-thumbs-up::before{content:"\f164"}.fa-user-clock::before{content:"\f4fd"}.fa-hand-dots::before{content:"\f461"}.fa-allergies::before{content:"\f461"}.fa-file-invoice::before{content:"\f570"}.fa-window-minimize::before{content:"\f2d1"}.fa-mug-saucer::before{content:"\f0f4"}.fa-coffee::before{content:"\f0f4"}.fa-brush::before{content:"\f55d"}.fa-mask::before{content:"\f6fa"}.fa-magnifying-glass-minus::before{content:"\f010"}.fa-search-minus::before{content:"\f010"}.fa-ruler-vertical::before{content:"\f548"}.fa-user-large::before{content:"\f406"}.fa-user-alt::before{content:"\f406"}.fa-train-tram::before{content:"\e5b4"}.fa-user-nurse::before{content:"\f82f"}.fa-syringe::before{content:"\f48e"}.fa-cloud-sun::before{content:"\f6c4"}.fa-stopwatch-20::before{content:"\e06f"}.fa-square-full::before{content:"\f45c"}.fa-magnet::before{content:"\f076"}.fa-jar::before{content:"\e516"}.fa-note-sticky::before{content:"\f249"}.fa-sticky-note::before{content:"\f249"}.fa-bug-slash::before{content:"\e490"}.fa-arrow-up-from-water-pump::before{content:"\e4b6"}.fa-bone::before{content:"\f5d7"}.fa-user-injured::before{content:"\f728"}.fa-face-sad-tear::before{content:"\f5b4"}.fa-sad-tear::before{content:"\f5b4"}.fa-plane::before{content:"\f072"}.fa-tent-arrows-down::before{content:"\e581"}.fa-exclamation::before{content:"\21"}.fa-arrows-spin::before{content:"\e4bb"}.fa-print::before{content:"\f02f"}.fa-turkish-lira-sign::before{content:"\e2bb"}.fa-try::before{content:"\e2bb"}.fa-turkish-lira::before{content:"\e2bb"}.fa-dollar-sign::before{content:"\24"}.fa-dollar::before{content:"\24"}.fa-usd::before{content:"\24"}.fa-x::before{content:"\58"}.fa-magnifying-glass-dollar::before{content:"\f688"}.fa-search-dollar::before{content:"\f688"}.fa-users-gear::before{content:"\f509"}.fa-users-cog::before{content:"\f509"}.fa-person-military-pointing::before{content:"\e54a"}.fa-building-columns::before{content:"\f19c"}.fa-bank::before{content:"\f19c"}.fa-institution::before{content:"\f19c"}.fa-museum::before{content:"\f19c"}.fa-university::before{content:"\f19c"}.fa-umbrella::before{content:"\f0e9"}.fa-trowel::before{content:"\e589"}.fa-d::before{content:"\44"}.fa-stapler::before{content:"\e5af"}.fa-masks-theater::before{content:"\f630"}.fa-theater-masks::before{content:"\f630"}.fa-kip-sign::before{content:"\e1c4"}.fa-hand-point-left::before{content:"\f0a5"}.fa-handshake-simple::before{content:"\f4c6"}.fa-handshake-alt::before{content:"\f4c6"}.fa-jet-fighter::before{content:"\f0fb"}.fa-fighter-jet::before{content:"\f0fb"}.fa-square-share-nodes::before{content:"\f1e1"}.fa-share-alt-square::before{content:"\f1e1"}.fa-barcode::before{content:"\f02a"}.fa-plus-minus::before{content:"\e43c"}.fa-video::before{content:"\f03d"}.fa-video-camera::before{content:"\f03d"}.fa-graduation-cap::before{content:"\f19d"}.fa-mortar-board::before{content:"\f19d"}.fa-hand-holding-medical::before{content:"\e05c"}.fa-person-circle-check::before{content:"\e53e"}.fa-turn-up::before{content:"\f3bf"}.fa-level-up-alt::before{content:"\f3bf"}.sr-only,.fa-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sr-only-focusable:not(:focus),.fa-sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}/*!* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com +* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) +* Copyright 2023 Fonticons, Inc.*/:root,:host{--fa-style-family-classic:'Font Awesome 6 Free';--fa-font-solid:normal 900 1em/1 'Font Awesome 6 Free'}@font-face{font-family:'font awesome 6 free';font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2)format("woff2"),url(../webfonts/fa-solid-900.ttf)format("truetype")}.fas,.td-offline-search-results__close-button:after,.fa-solid{font-weight:900}/*!* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com +* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) +* Copyright 2023 Fonticons, Inc.*/:root,:host{--fa-style-family-brands:'Font Awesome 6 Brands';--fa-font-brands:normal 400 1em/1 'Font Awesome 6 Brands'}@font-face{font-family:'font awesome 6 brands';font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2)format("woff2"),url(../webfonts/fa-brands-400.ttf)format("truetype")}.fab,.fa-brands{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-square-js:before{content:"\f3b9"}.fa-js-square:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-square-reddit:before{content:"\f1a2"}.fa-reddit-square:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-square-instagram:before{content:"\e055"}.fa-instagram-square:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-square-hacker-news:before{content:"\f3af"}.fa-hacker-news-square:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-square-snapchat:before{content:"\f2ad"}.fa-snapchat-square:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before{content:"\f2aa"}.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-square-dribbble:before{content:"\f397"}.fa-dribbble-square:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before{content:"\f081"}.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before{content:"\f431"}.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-wpressr:before{content:"\f3e4"}.fa-rendact:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before{content:"\f1b7"}.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before{content:"\f194"}.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-flag:before{content:"\f2b4"}.fa-font-awesome-logo-full:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-square-github:before{content:"\f092"}.fa-github-square:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-square-gitlab:before{content:"\e5ae"}.fa-gitlab-square:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-square-odnoklassniki:before{content:"\f264"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-square-pinterest:before{content:"\f0d3"}.fa-pinterest-square:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-square-google-plus:before{content:"\f0d4"}.fa-google-plus-square:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before{content:"\f169"}.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before{content:"\e080"}.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-square-pied-piper:before{content:"\e01e"}.fa-pied-piper-square:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-square-facebook:before{content:"\f082"}.fa-facebook-square:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-square-lastfm:before{content:"\f203"}.fa-lastfm-square:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before{content:"\e2d0"}.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-square-behance:before{content:"\f1b5"}.fa-behance-square:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-square-git:before{content:"\f1d2"}.fa-git-square:before{content:"\f1d2"}.fa-square-tumblr:before{content:"\f174"}.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before{content:"\f40c"}.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}.td-border-top{border:none;border-top:1px solid #eee}.td-border-none{border:none}.td-block-padding,.td-default main section{padding-top:4rem;padding-bottom:4rem}@media(min-width:768px){.td-block-padding,.td-default main section{padding-top:5rem;padding-bottom:5rem}}.td-overlay{position:relative}.td-overlay::after{content:"";position:absolute;top:0;right:0;bottom:0;left:0}.td-overlay--dark::after{background-color:rgba(64,63,76,.3)}.td-overlay--light::after{background-color:rgba(211,243,238,.3)}.td-overlay__inner{position:relative;z-index:1}@media(min-width:992px){.td-max-width-on-larger-screens,.td-card.card,.td-content .td-card.highlight,.td-card-group.card-group,.td-content>.tab-content .tab-pane,.td-content .footnotes,.td-content>.alert,.td-content>.highlight,.td-content>.lead,.td-content>.td-table,.td-box .td-content>table,.td-content>table,.td-content>blockquote,.td-content>dl dd,.td-content>h1,.td-content>.h1,.td-content>h2,.td-content>.h2,.td-content>ol,.td-content>p,.td-content>pre,.td-content>ul{max-width:80%}}.-bg-blue{color:#fff;background-color:#0d6efd}.-bg-blue p:not(.p-initial)>a{color:#81b3fe}.-bg-blue p:not(.p-initial)>a:hover{color:#094db1}.-text-blue{color:#0d6efd}.-bg-indigo{color:#fff;background-color:#6610f2}.-bg-indigo p:not(.p-initial)>a{color:#85b6fe}.-bg-indigo p:not(.p-initial)>a:hover{color:#094db1}.-text-indigo{color:#6610f2}.-bg-purple{color:#fff;background-color:#6f42c1}.-bg-purple p:not(.p-initial)>a{color:#84b5fe}.-bg-purple p:not(.p-initial)>a:hover{color:#094db1}.-text-purple{color:#6f42c1}.-bg-pink{color:#fff;background-color:#d63384}.-bg-pink p:not(.p-initial)>a{color:#81b4fe}.-bg-pink p:not(.p-initial)>a:hover{color:#094db1}.-text-pink{color:#d63384}.-bg-red{color:#fff;background-color:#dc3545}.-bg-red p:not(.p-initial)>a{color:#7db1fe}.-bg-red p:not(.p-initial)>a:hover{color:#094db1}.-text-red{color:#dc3545}.-bg-orange{color:#000;background-color:#fd7e14}.-bg-orange p:not(.p-initial)>a{color:#073b87}.-bg-orange p:not(.p-initial)>a:hover{color:#094db1}.-text-orange{color:#fd7e14}.-bg-yellow{color:#000;background-color:#ffc107}.-bg-yellow p:not(.p-initial)>a{color:#073982}.-bg-yellow p:not(.p-initial)>a:hover{color:#094db1}.-text-yellow{color:#ffc107}.-bg-green{color:#fff;background-color:#198754}.-bg-green p:not(.p-initial)>a{color:#b3d2fe}.-bg-green p:not(.p-initial)>a:hover{color:#094db1}.-text-green{color:#198754}.-bg-teal{color:#000;background-color:#20c997}.-bg-teal p:not(.p-initial)>a{color:#063274}.-bg-teal p:not(.p-initial)>a:hover{color:#094db1}.-text-teal{color:#20c997}.-bg-cyan{color:#000;background-color:#0dcaf0}.-bg-cyan p:not(.p-initial)>a{color:#06377e}.-bg-cyan p:not(.p-initial)>a:hover{color:#094db1}.-text-cyan{color:#0dcaf0}.-bg-black{color:#fff;background-color:#000}.-bg-black p:not(.p-initial)>a{color:#fff}.-bg-black p:not(.p-initial)>a:hover{color:#094db1}.-text-black{color:#000}.-bg-white{color:#000;background-color:#fff}.-bg-white p:not(.p-initial)>a{color:#0d6efd}.-bg-white p:not(.p-initial)>a:hover{color:#094db1}.-text-white{color:#fff}.-bg-gray{color:#fff;background-color:#6c757d}.-bg-gray p:not(.p-initial)>a{color:#90bdfe}.-bg-gray p:not(.p-initial)>a:hover{color:#094db1}.-text-gray{color:#6c757d}.-bg-gray-dark{color:#fff;background-color:#343a40}.-bg-gray-dark p:not(.p-initial)>a{color:#c8deff}.-bg-gray-dark p:not(.p-initial)>a:hover{color:#094db1}.-text-gray-dark{color:#343a40}.-bg-primary{color:#fff;background-color:#081b4b}.-bg-primary p:not(.p-initial)>a{color:#d8e7ff}.-bg-primary p:not(.p-initial)>a:hover{color:#094db1}.-text-primary{color:#081b4b}.-bg-secondary{color:#000;background-color:#fff}.-bg-secondary p:not(.p-initial)>a{color:#0d6efd}.-bg-secondary p:not(.p-initial)>a:hover{color:#094db1}.-text-secondary{color:#fff}.-bg-success{color:#000;background-color:#3772ff}.-bg-success p:not(.p-initial)>a{color:#08439a}.-bg-success p:not(.p-initial)>a:hover{color:#094db1}.-text-success{color:#3772ff}.-bg-info{color:#000;background-color:#c0e0de}.-bg-info p:not(.p-initial)>a{color:#0b5ace}.-bg-info p:not(.p-initial)>a:hover{color:#094db1}.-text-info{color:#c0e0de}.-bg-warning{color:#000;background-color:#ed6a5a}.-bg-warning p:not(.p-initial)>a{color:#0847a2}.-bg-warning p:not(.p-initial)>a:hover{color:#094db1}.-text-warning{color:#ed6a5a}.-bg-danger{color:#000;background-color:#ed6a5a}.-bg-danger p:not(.p-initial)>a{color:#0847a2}.-bg-danger p:not(.p-initial)>a:hover{color:#094db1}.-text-danger{color:#ed6a5a}.-bg-light{color:#000;background-color:#d3f3ee}.-bg-light p:not(.p-initial)>a{color:#0c62e1}.-bg-light p:not(.p-initial)>a:hover{color:#094db1}.-text-light{color:#d3f3ee}.-bg-dark{color:#fff;background-color:#403f4c}.-bg-dark p:not(.p-initial)>a{color:#bdd7fe}.-bg-dark p:not(.p-initial)>a:hover{color:#094db1}.-text-dark{color:#403f4c}.-bg-100{color:#000;background-color:#f8f9fa}.-bg-100 p:not(.p-initial)>a{color:#0d6bf7}.-bg-100 p:not(.p-initial)>a:hover{color:#094db1}.-text-100{color:#f8f9fa}.-bg-200{color:#000;background-color:#e9ecef}.-bg-200 p:not(.p-initial)>a{color:#0c66ea}.-bg-200 p:not(.p-initial)>a:hover{color:#094db1}.-text-200{color:#e9ecef}.-bg-300{color:#000;background-color:#dee2e6}.-bg-300 p:not(.p-initial)>a{color:#0c61e0}.-bg-300 p:not(.p-initial)>a:hover{color:#094db1}.-text-300{color:#dee2e6}.-bg-400{color:#000;background-color:#ced4da}.-bg-400 p:not(.p-initial)>a{color:#0b5bd2}.-bg-400 p:not(.p-initial)>a:hover{color:#094db1}.-text-400{color:#ced4da}.-bg-500{color:#000;background-color:#adb5bd}.-bg-500 p:not(.p-initial)>a{color:#094eb4}.-bg-500 p:not(.p-initial)>a:hover{color:#094db1}.-text-500{color:#adb5bd}.-bg-600{color:#fff;background-color:#6c757d}.-bg-600 p:not(.p-initial)>a{color:#90bdfe}.-bg-600 p:not(.p-initial)>a:hover{color:#094db1}.-text-600{color:#6c757d}.-bg-700{color:#fff;background-color:#495057}.-bg-700 p:not(.p-initial)>a{color:#b3d2fe}.-bg-700 p:not(.p-initial)>a:hover{color:#094db1}.-text-700{color:#495057}.-bg-800{color:#fff;background-color:#343a40}.-bg-800 p:not(.p-initial)>a{color:#c8deff}.-bg-800 p:not(.p-initial)>a:hover{color:#094db1}.-text-800{color:#343a40}.-bg-900{color:#fff;background-color:#212529}.-bg-900 p:not(.p-initial)>a{color:#dceaff}.-bg-900 p:not(.p-initial)>a:hover{color:#094db1}.-text-900{color:#212529}.-bg-0{color:#fff;background-color:#403f4c}.-bg-0 p:not(.p-initial)>a{color:#bdd7fe}.-bg-0 p:not(.p-initial)>a:hover{color:#094db1}.-text-0{color:#403f4c}.-bg-1{color:#fff;background-color:#081b4b}.-bg-1 p:not(.p-initial)>a{color:#d8e7ff}.-bg-1 p:not(.p-initial)>a:hover{color:#094db1}.-text-1{color:#081b4b}.-bg-2{color:#000;background-color:#fff}.-bg-2 p:not(.p-initial)>a{color:#0d6efd}.-bg-2 p:not(.p-initial)>a:hover{color:#094db1}.-text-2{color:#fff}.-bg-3{color:#000;background-color:#c0e0de}.-bg-3 p:not(.p-initial)>a{color:#0b5ace}.-bg-3 p:not(.p-initial)>a:hover{color:#094db1}.-text-3{color:#c0e0de}.-bg-4{color:#000;background-color:#fff}.-bg-4 p:not(.p-initial)>a{color:#0d6efd}.-bg-4 p:not(.p-initial)>a:hover{color:#094db1}.-text-4{color:#fff}.-bg-5{color:#fff;background-color:#6c757d}.-bg-5 p:not(.p-initial)>a{color:#90bdfe}.-bg-5 p:not(.p-initial)>a:hover{color:#094db1}.-text-5{color:#6c757d}.-bg-6{color:#000;background-color:#3772ff}.-bg-6 p:not(.p-initial)>a{color:#08439a}.-bg-6 p:not(.p-initial)>a:hover{color:#094db1}.-text-6{color:#3772ff}.-bg-7{color:#000;background-color:#ed6a5a}.-bg-7 p:not(.p-initial)>a{color:#0847a2}.-bg-7 p:not(.p-initial)>a:hover{color:#094db1}.-text-7{color:#ed6a5a}.-bg-8{color:#fff;background-color:#403f4c}.-bg-8 p:not(.p-initial)>a{color:#bdd7fe}.-bg-8 p:not(.p-initial)>a:hover{color:#094db1}.-text-8{color:#403f4c}.-bg-9{color:#000;background-color:#ed6a5a}.-bg-9 p:not(.p-initial)>a{color:#0847a2}.-bg-9 p:not(.p-initial)>a:hover{color:#094db1}.-text-9{color:#ed6a5a}.-bg-10{color:#fff;background-color:#081b4b}.-bg-10 p:not(.p-initial)>a{color:#d8e7ff}.-bg-10 p:not(.p-initial)>a:hover{color:#094db1}.-text-10{color:#081b4b}.-bg-11{color:#000;background-color:#fff}.-bg-11 p:not(.p-initial)>a{color:#0d6efd}.-bg-11 p:not(.p-initial)>a:hover{color:#094db1}.-text-11{color:#fff}.-bg-12{color:#000;background-color:#c0e0de}.-bg-12 p:not(.p-initial)>a{color:#0b5ace}.-bg-12 p:not(.p-initial)>a:hover{color:#094db1}.-text-12{color:#c0e0de}.td-table:not(.td-initial),.td-content table:not(.td-initial),.td-box table:not(.td-initial){display:block}.td-box--height-min{min-height:300px}.td-box--height-med{min-height:400px}.td-box--height-max{min-height:500px}.td-box--height-full{min-height:100vh}@media(min-width:768px){.td-box--height-min{min-height:450px}.td-box--height-med{min-height:500px}.td-box--height-max{min-height:650px}}.td-box .row{padding-left:5vw;padding-right:5vw}.td-box.linkbox{padding:5vh 5vw}.td-box--0{color:#fff;background-color:#403f4c}.td-box--0 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#403f4c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--0 p>a,.td-box--0 span>a{color:#bdd7fe}.td-box--0 p>a:hover,.td-box--0 span>a:hover{color:#d1e3fe}.td-box--1{color:#fff;background-color:#081b4b}.td-box--1 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#081b4b transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--1 p>a,.td-box--1 span>a{color:#d8e7ff}.td-box--1 p>a:hover,.td-box--1 span>a:hover{color:#e4eeff}.td-box--2{color:#000;background-color:#fff}.td-box--2 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--2 p>a,.td-box--2 span>a{color:#0d6efd}.td-box--2 p>a:hover,.td-box--2 span>a:hover{color:#094db1}.td-box--3{color:#000;background-color:#c0e0de}.td-box--3 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#c0e0de transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--3 p>a,.td-box--3 span>a{color:#0b5ace}.td-box--3 p>a:hover,.td-box--3 span>a:hover{color:#083f90}.td-box--4{color:#000;background-color:#fff}.td-box--4 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--4 p>a,.td-box--4 span>a{color:#0d6efd}.td-box--4 p>a:hover,.td-box--4 span>a:hover{color:#094db1}.td-box--5{color:#fff;background-color:#6c757d}.td-box--5 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6c757d transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--5 p>a,.td-box--5 span>a{color:#90bdfe}.td-box--5 p>a:hover,.td-box--5 span>a:hover{color:#b1d1fe}.td-box--6{color:#000;background-color:#3772ff}.td-box--6 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#3772ff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--6 p>a,.td-box--6 span>a{color:#08439a}.td-box--6 p>a:hover,.td-box--6 span>a:hover{color:#062f6c}.td-box--7{color:#000;background-color:#ed6a5a}.td-box--7 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--7 p>a,.td-box--7 span>a{color:#0847a2}.td-box--7 p>a:hover,.td-box--7 span>a:hover{color:#063271}.td-box--8{color:#fff;background-color:#403f4c}.td-box--8 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#403f4c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--8 p>a,.td-box--8 span>a{color:#bdd7fe}.td-box--8 p>a:hover,.td-box--8 span>a:hover{color:#d1e3fe}.td-box--9{color:#000;background-color:#ed6a5a}.td-box--9 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--9 p>a,.td-box--9 span>a{color:#0847a2}.td-box--9 p>a:hover,.td-box--9 span>a:hover{color:#063271}.td-box--10{color:#fff;background-color:#081b4b}.td-box--10 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#081b4b transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--10 p>a,.td-box--10 span>a{color:#d8e7ff}.td-box--10 p>a:hover,.td-box--10 span>a:hover{color:#e4eeff}.td-box--11{color:#000;background-color:#fff}.td-box--11 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--11 p>a,.td-box--11 span>a{color:#0d6efd}.td-box--11 p>a:hover,.td-box--11 span>a:hover{color:#094db1}.td-box--12{color:#000;background-color:#c0e0de}.td-box--12 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#c0e0de transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--12 p>a,.td-box--12 span>a{color:#0b5ace}.td-box--12 p>a:hover,.td-box--12 span>a:hover{color:#083f90}.td-box--blue{color:#fff;background-color:#0d6efd}.td-box--blue .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#0d6efd transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--blue p>a,.td-box--blue span>a{color:#81b3fe}.td-box--blue p>a:hover,.td-box--blue span>a:hover{color:#a7cafe}.td-box--indigo{color:#fff;background-color:#6610f2}.td-box--indigo .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6610f2 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--indigo p>a,.td-box--indigo span>a{color:#85b6fe}.td-box--indigo p>a:hover,.td-box--indigo span>a:hover{color:#aaccfe}.td-box--purple{color:#fff;background-color:#6f42c1}.td-box--purple .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6f42c1 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--purple p>a,.td-box--purple span>a{color:#84b5fe}.td-box--purple p>a:hover,.td-box--purple span>a:hover{color:#a9cbfe}.td-box--pink{color:#fff;background-color:#d63384}.td-box--pink .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#d63384 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--pink p>a,.td-box--pink span>a{color:#81b4fe}.td-box--pink p>a:hover,.td-box--pink span>a:hover{color:#a7cbfe}.td-box--red{color:#fff;background-color:#dc3545}.td-box--red .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#dc3545 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--red p>a,.td-box--red span>a{color:#7db1fe}.td-box--red p>a:hover,.td-box--red span>a:hover{color:#a4c8fe}.td-box--orange{color:#000;background-color:#fd7e14}.td-box--orange .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fd7e14 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--orange p>a,.td-box--orange span>a{color:#073b87}.td-box--orange p>a:hover,.td-box--orange span>a:hover{color:#05295f}.td-box--yellow{color:#000;background-color:#ffc107}.td-box--yellow .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ffc107 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--yellow p>a,.td-box--yellow span>a{color:#073982}.td-box--yellow p>a:hover,.td-box--yellow span>a:hover{color:#05285b}.td-box--green{color:#fff;background-color:#198754}.td-box--green .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#198754 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--green p>a,.td-box--green span>a{color:#b3d2fe}.td-box--green p>a:hover,.td-box--green span>a:hover{color:#cae0fe}.td-box--teal{color:#000;background-color:#20c997}.td-box--teal .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#20c997 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--teal p>a,.td-box--teal span>a{color:#063274}.td-box--teal p>a:hover,.td-box--teal span>a:hover{color:#042351}.td-box--cyan{color:#000;background-color:#0dcaf0}.td-box--cyan .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#0dcaf0 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--cyan p>a,.td-box--cyan span>a{color:#06377e}.td-box--cyan p>a:hover,.td-box--cyan span>a:hover{color:#042758}.td-box--black{color:#fff;background-color:#000}.td-box--black .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#000 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--black p>a,.td-box--black span>a{color:#fff}.td-box--black p>a:hover,.td-box--black span>a:hover{color:#fff}.td-box--white{color:#000;background-color:#fff}.td-box--white .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--white p>a,.td-box--white span>a{color:#0d6efd}.td-box--white p>a:hover,.td-box--white span>a:hover{color:#094db1}.td-box--gray{color:#fff;background-color:#6c757d}.td-box--gray .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6c757d transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--gray p>a,.td-box--gray span>a{color:#90bdfe}.td-box--gray p>a:hover,.td-box--gray span>a:hover{color:#b1d1fe}.td-box--gray-dark{color:#fff;background-color:#343a40}.td-box--gray-dark .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#343a40 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--gray-dark p>a,.td-box--gray-dark span>a{color:#c8deff}.td-box--gray-dark p>a:hover,.td-box--gray-dark span>a:hover{color:#d9e8ff}.td-box--primary{color:#fff;background-color:#081b4b}.td-box--primary .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#081b4b transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--primary p>a,.td-box--primary span>a{color:#d8e7ff}.td-box--primary p>a:hover,.td-box--primary span>a:hover{color:#e4eeff}.td-box--secondary{color:#000;background-color:#fff}.td-box--secondary .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--secondary p>a,.td-box--secondary span>a{color:#0d6efd}.td-box--secondary p>a:hover,.td-box--secondary span>a:hover{color:#094db1}.td-box--success{color:#000;background-color:#3772ff}.td-box--success .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#3772ff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--success p>a,.td-box--success span>a{color:#08439a}.td-box--success p>a:hover,.td-box--success span>a:hover{color:#062f6c}.td-box--info{color:#000;background-color:#c0e0de}.td-box--info .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#c0e0de transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--info p>a,.td-box--info span>a{color:#0b5ace}.td-box--info p>a:hover,.td-box--info span>a:hover{color:#083f90}.td-box--warning{color:#000;background-color:#ed6a5a}.td-box--warning .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--warning p>a,.td-box--warning span>a{color:#0847a2}.td-box--warning p>a:hover,.td-box--warning span>a:hover{color:#063271}.td-box--danger{color:#000;background-color:#ed6a5a}.td-box--danger .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--danger p>a,.td-box--danger span>a{color:#0847a2}.td-box--danger p>a:hover,.td-box--danger span>a:hover{color:#063271}.td-box--light{color:#000;background-color:#d3f3ee}.td-box--light .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#d3f3ee transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--light p>a,.td-box--light span>a{color:#0c62e1}.td-box--light p>a:hover,.td-box--light span>a:hover{color:#08459e}.td-box--dark,.td-footer{color:#fff;background-color:#403f4c}.td-box--dark .td-arrow-down::before,.td-footer .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#403f4c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--dark p>a,.td-footer p>a,.td-box--dark span>a,.td-footer span>a{color:#bdd7fe}.td-box--dark p>a:hover,.td-footer p>a:hover,.td-box--dark span>a:hover,.td-footer span>a:hover{color:#d1e3fe}.td-box--100{color:#000;background-color:#f8f9fa}.td-box--100 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#f8f9fa transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--100 p>a,.td-box--100 span>a{color:#0d6bf7}.td-box--100 p>a:hover,.td-box--100 span>a:hover{color:#094bad}.td-box--200{color:#000;background-color:#e9ecef}.td-box--200 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#e9ecef transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--200 p>a,.td-box--200 span>a{color:#0c66ea}.td-box--200 p>a:hover,.td-box--200 span>a:hover{color:#0847a4}.td-box--300{color:#000;background-color:#dee2e6}.td-box--300 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#dee2e6 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--300 p>a,.td-box--300 span>a{color:#0c61e0}.td-box--300 p>a:hover,.td-box--300 span>a:hover{color:#08449d}.td-box--400{color:#000;background-color:#ced4da}.td-box--400 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ced4da transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--400 p>a,.td-box--400 span>a{color:#0b5bd2}.td-box--400 p>a:hover,.td-box--400 span>a:hover{color:#084093}.td-box--500{color:#000;background-color:#adb5bd}.td-box--500 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#adb5bd transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--500 p>a,.td-box--500 span>a{color:#094eb4}.td-box--500 p>a:hover,.td-box--500 span>a:hover{color:#06377e}.td-box--600{color:#fff;background-color:#6c757d}.td-box--600 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6c757d transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--600 p>a,.td-box--600 span>a{color:#90bdfe}.td-box--600 p>a:hover,.td-box--600 span>a:hover{color:#b1d1fe}.td-box--700{color:#fff;background-color:#495057}.td-box--700 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#495057 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--700 p>a,.td-box--700 span>a{color:#b3d2fe}.td-box--700 p>a:hover,.td-box--700 span>a:hover{color:#cae0fe}.td-box--800{color:#fff;background-color:#343a40}.td-box--800 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#343a40 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--800 p>a,.td-box--800 span>a{color:#c8deff}.td-box--800 p>a:hover,.td-box--800 span>a:hover{color:#d9e8ff}.td-box--900{color:#fff;background-color:#212529}.td-box--900 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#212529 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--900 p>a,.td-box--900 span>a{color:#dceaff}.td-box--900 p>a:hover,.td-box--900 span>a:hover{color:#e7f0ff}.td-blog .td-rss-button{border-radius:2rem;float:right;display:none}.td-blog-posts-list{margin-top:1.5rem!important}.td-blog-posts-list__item{display:flex;align-items:flex-start;margin-bottom:1.5rem!important}.td-blog-posts-list__item__body{flex:1}.td-content .highlight{margin:2rem 0;padding:0;position:relative}.td-content .highlight .click-to-copy{display:block;text-align:right}.td-content .highlight pre{margin:0;padding:1rem;border-radius:inherit}.td-content .highlight pre button.td-click-to-copy{position:absolute;color:#ced4da;border-radius:3px;border-width:0;background-color:inherit;box-shadow:1px 1px #ced4da;right:4px;top:2px}.td-content .highlight pre button.td-click-to-copy:hover{color:#403f4c;background-color:#ced4da}.td-content .highlight pre button.td-click-to-copy:active{color:#403f4c;background-color:#ced4da;transform:translateY(2px)}.td-content p code,.td-content li>code,.td-content table code{color:inherit;padding:.2em .4em;margin:0;font-size:85%;word-break:normal;background-color:rgba(0,0,0,5%);border-radius:.375rem}.td-content p code br,.td-content li>code br,.td-content table code br{display:none}.td-content pre{word-wrap:normal;background-color:#f8f9fa;padding:1rem}.td-content pre>code{background-color:inherit!important;padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;border:0}.td-content pre.mermaid{background-color:inherit;font-size:0;padding:0}@media(min-width:768px){.td-navbar-cover{background:0 0!important}.td-navbar-cover .nav-link{text-shadow:1px 1px 2px #403f4c}}.td-navbar-cover.navbar-bg-onscroll .nav-link{text-shadow:none}.navbar-bg-onscroll{background:#081b4b!important;opacity:inherit}.td-navbar{background:#081b4b;min-height:4rem;margin:0;z-index:32}.td-navbar .navbar-brand{text-transform:none}.td-navbar .navbar-brand__name{font-weight:700}.td-navbar .navbar-brand svg{display:inline-block;margin:0 10px;height:30px}.td-navbar .navbar-nav{padding-top:.5rem;white-space:nowrap}.td-navbar .nav-link{text-transform:none;font-weight:700}.td-navbar .dropdown{min-width:100px}@media(min-width:768px){.td-navbar{position:fixed;top:0;width:100%}.td-navbar .nav-item{padding-inline-end:.5rem}.td-navbar .navbar-nav{padding-top:0!important}}@media(max-width:991.98px){.td-navbar .td-navbar-nav-scroll{max-width:100%;height:2.5rem;overflow:hidden;font-size:.9rem}.td-navbar .navbar-brand{margin-right:0}.td-navbar .navbar-nav{padding-bottom:2rem;overflow-x:auto}}#main_navbar li i{padding-right:.5em}#main_navbar li i:before{display:inline-block;text-align:center;min-width:1em}#main_navbar .alert{background-color:inherit;padding:0;color:#fff;border:0;font-weight:inherit}#main_navbar .alert:before{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased;font-family:"font awesome 6 free";font-weight:900;content:"\f0d9";padding-left:.5em;padding-right:.5em}nav.foldable-nav#td-section-nav{position:relative}nav.foldable-nav#td-section-nav label{margin-bottom:0;width:100%}nav.foldable-nav .td-sidebar-nav__section,nav.foldable-nav .with-child ul{list-style:none;padding:0;margin:0}nav.foldable-nav .ul-1>li{padding-left:1.5em}nav.foldable-nav ul.foldable{display:none}nav.foldable-nav input:checked~ul.foldable{display:block}nav.foldable-nav input[type=checkbox]{display:none}nav.foldable-nav .with-child,nav.foldable-nav .without-child{position:relative;padding-left:1.5em}nav.foldable-nav .ul-1 .with-child>label:before{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased;font-family:"font awesome 6 free";font-weight:900;content:"\f0da";position:absolute;left:.1em;padding-left:.4em;padding-right:.4em;font-size:1em;color:#212529;transition:all .5s}nav.foldable-nav .ul-1 .with-child>label:before:hover{transform:rotate(90deg)}nav.foldable-nav .ul-1 .with-child>input:checked~label:before{color:#081b4b;transform:rotate(90deg);transition:transform .5s}nav.foldable-nav .with-child ul{margin-top:.1em}@media(hover:hover) and (pointer:fine){nav.foldable-nav .ul-1 .with-child>label:hover:before{color:#081b4b;transition:color .3s}nav.foldable-nav .ul-1 .with-child>input:checked~label:hover:before{color:#081b4b;transition:color .3s}}.td-sidebar-nav{padding-right:.5rem;margin-right:-15px;margin-left:-15px}@media(min-width:768px){@supports(position:sticky){.td-sidebar-nav{max-height:calc(100vh - 8.5rem);overflow-y:auto}}}@media(min-width:992px){.td-sidebar-nav.td-sidebar-nav--search-disabled{padding-top:1rem}@supports(position:sticky){.td-sidebar-nav.td-sidebar-nav--search-disabled{max-height:calc(calc(100vh - 8.5rem) + 4.5rem)}}}@media(min-width:768px){.td-sidebar-nav{display:block!important}}.td-sidebar-nav__section{padding-left:0}.td-sidebar-nav__section li{list-style:none}.td-sidebar-nav__section.ul-0,.td-sidebar-nav__section ul{padding:0;margin:0}@media(min-width:768px){.td-sidebar-nav__section .ul-1 ul{padding-left:1.5em}}.td-sidebar-nav__section-title{display:block;font-weight:500}.td-sidebar-nav__section-title .active{font-weight:700}.td-sidebar-nav__section-title a{color:#212529}.td-sidebar-nav .td-sidebar-link{display:block;padding-bottom:.375rem}.td-sidebar-nav .td-sidebar-link__page{color:#495057;font-weight:300}.td-sidebar-nav a:focus,.td-sidebar-nav a:hover{color:#0d6efd}.td-sidebar-nav a.active{font-weight:700}.td-sidebar-nav .dropdown a{color:#495057}.td-sidebar-nav .dropdown .nav-link{padding:0 0 1rem}.td-sidebar-nav>.td-sidebar-nav__section{padding-left:1.5rem}.td-sidebar-nav li i{padding-right:.5em}.td-sidebar-nav li i:before{display:inline-block;text-align:center;min-width:1em}.td-sidebar-nav .td-sidebar-link.tree-root{font-weight:700;color:#081b4b;border-bottom:1px #081b4b solid;margin-bottom:1rem}.td-sidebar{padding-bottom:1rem}.td-sidebar a{text-decoration:none}.td-sidebar a:focus,.td-sidebar a:hover{text-decoration:initial}.td-sidebar .btn-link{text-decoration:none}@media(min-width:768px){.td-sidebar{padding-top:4rem;background-color:rgba(8,27,75,3%);padding-right:1rem;border-right:1px solid #dee2e6}}.td-sidebar__toggle{line-height:1;color:#212529;margin:1rem}.td-sidebar__search{padding:1rem 0}.td-sidebar__inner{order:0}@media(min-width:768px){@supports(position:sticky){.td-sidebar__inner{position:sticky;top:4rem;z-index:10;height:calc(100vh - 5rem)}}}@media(min-width:1200px){.td-sidebar__inner{flex:0 1 320px}}.td-sidebar__inner .td-search-box{width:100%}.td-sidebar #content-desktop{display:block}.td-sidebar #content-mobile{display:none}@media(max-width:991.98px){.td-sidebar #content-desktop{display:none}.td-sidebar #content-mobile{display:block}}.td-sidebar-toc{border-left:1px solid #dee2e6;order:2;padding-top:.75rem;padding-bottom:1.5rem;vertical-align:top}.td-sidebar-toc a{text-decoration:none}.td-sidebar-toc a:focus,.td-sidebar-toc a:hover{text-decoration:initial}.td-sidebar-toc .btn-link{text-decoration:none}@supports(position:sticky){.td-sidebar-toc{position:sticky;top:4rem;height:calc(100vh - 4rem);overflow-y:auto}}.td-sidebar-toc .td-page-meta a{display:block;font-weight:500}.td-toc a{display:block;font-weight:300;padding-bottom:.25rem}.td-toc li{list-style:none;display:block}.td-toc li li{margin-left:.5rem}.td-toc #TableOfContents a{color:#6c757d}.td-toc #TableOfContents a:focus,.td-toc #TableOfContents a:hover{color:initial}.td-toc ul{padding-left:0}@media print{.td-breadcrumbs{display:none!important}}.td-breadcrumbs .breadcrumb{background:inherit;padding-left:0;padding-top:0}.alert{font-weight:500;background:#fff;color:inherit;border-radius:0}.alert-primary{border-style:solid;border-color:#081b4b;border-width:0 0 0 4px}.alert-primary .alert-heading{color:#081b4b}.alert-secondary{border-style:solid;border-color:#fff;border-width:0 0 0 4px}.alert-secondary .alert-heading{color:#fff}.alert-success{border-style:solid;border-color:#3772ff;border-width:0 0 0 4px}.alert-success .alert-heading{color:#3772ff}.alert-info{border-style:solid;border-color:#c0e0de;border-width:0 0 0 4px}.alert-info .alert-heading{color:#c0e0de}.alert-warning{border-style:solid;border-color:#ed6a5a;border-width:0 0 0 4px}.alert-warning .alert-heading{color:#ed6a5a}.alert-danger{border-style:solid;border-color:#ed6a5a;border-width:0 0 0 4px}.alert-danger .alert-heading{color:#ed6a5a}.alert-light{border-style:solid;border-color:#d3f3ee;border-width:0 0 0 4px}.alert-light .alert-heading{color:#d3f3ee}.alert-dark{border-style:solid;border-color:#403f4c;border-width:0 0 0 4px}.alert-dark .alert-heading{color:#403f4c}.td-content{order:1}.td-content p,.td-content li,.td-content td{font-weight:400}.td-content>h1,.td-content>.h1{font-weight:700;margin-bottom:1rem}.td-content>h2,.td-content>.h2{margin-bottom:1rem}.td-content>h2:not(:first-child),.td-content>.h2:not(:first-child){margin-top:3rem}.td-content>h2+h3,.td-content>.h2+h3,.td-content>h2+.h3,.td-content>h2+.td-footer__links-item,.td-content>.h2+.h3,.td-content>.h2+.td-footer__links-item{margin-top:1rem}.td-content>h3,.td-content>.h3,.td-content>.td-footer__links-item,.td-content>h4,.td-content>.h4,.td-content>h5,.td-content>.h5,.td-content>h6,.td-content>.h6{margin-bottom:1rem;margin-top:2rem}.td-content blockquote{padding:0 0 0 1rem;margin-bottom:1rem;color:#6c757d;border-left:6px solid #fff}.td-content ul li,.td-content ol li{margin-bottom:.25rem}.td-content strong{font-weight:700}.td-content .alert:not(:first-child){margin-top:2rem;margin-bottom:2rem}.td-content .lead{margin-bottom:1.5rem}.td-title{margin-top:1rem;margin-bottom:.5rem}@media(min-width:576px){.td-title{font-size:3rem}}.td-heading-self-link{font-size:90%;padding-left:.25em;text-decoration:none;visibility:hidden}.td-heading-self-link:before{content:'#'}@media(hover:none) and (pointer:coarse),(max-width:576px){.td-heading-self-link{visibility:visible}}h1:hover>.td-heading-self-link,.h1:hover>.td-heading-self-link{visibility:visible}h2:hover>.td-heading-self-link,.h2:hover>.td-heading-self-link{visibility:visible}h3:hover>.td-heading-self-link,.h3:hover>.td-heading-self-link,.td-footer__links-item:hover>.td-heading-self-link{visibility:visible}h4:hover>.td-heading-self-link,.h4:hover>.td-heading-self-link{visibility:visible}h5:hover>.td-heading-self-link,.h5:hover>.td-heading-self-link{visibility:visible}h6:hover>.td-heading-self-link,.h6:hover>.td-heading-self-link{visibility:visible}.td-search{background:0 0;position:relative;width:100%}.td-search__icon{display:flex;align-items:center;height:100%;position:absolute;left:.75em;pointer-events:none}.td-search__icon:before{content:"\f002"}.td-navbar .td-search__icon{color:rgba(255,255,255,.75)}.td-search__input{width:100%;text-indent:1.25em}.td-search__input:not(:focus){background:0 0}.td-search__input.form-control:focus{border-color:#f3f4f6;box-shadow:0 0 0 2px #6b7693;color:inherit}.td-navbar .td-search__input{border:none;color:rgba(255,255,255,.75)}.td-navbar .td-search__input::-webkit-input-placeholder{color:rgba(255,255,255,.75)}.td-navbar .td-search__input:-moz-placeholder{color:rgba(255,255,255,.75)}.td-navbar .td-search__input::-moz-placeholder{color:rgba(255,255,255,.75)}.td-navbar .td-search__input:-ms-input-placeholder{color:rgba(255,255,255,.75)}.td-search:focus-within .td-search__icon{display:none}.td-search:focus-within .td-search-input{text-indent:0}.td-search:not(:focus-within){color:#6c757d}.td-sidebar .td-search--algolia{display:block;padding:0 .5rem}.td-sidebar .td-search--algolia>button{margin:0;width:100%}.td-search--offline:focus-within .td-search__icon{display:flex;color:#6c757d}.td-offline-search-results{max-width:90%}.td-offline-search-results .card,.td-offline-search-results .td-content .highlight,.td-content .td-offline-search-results .highlight{margin-bottom:.5rem}.td-offline-search-results .card .card-header,.td-offline-search-results .td-content .highlight .card-header,.td-content .td-offline-search-results .highlight .card-header{font-weight:700}.td-offline-search-results__close-button{float:right}.td-offline-search-results__close-button:after{content:"\f00d"}.td-outer{display:flex;flex-direction:column;min-height:100vh}@media(min-width:768px){.td-default main>section:first-of-type{padding-top:8rem}}.td-main{flex-grow:1}.td-404 main,.td-main main{padding-top:1.5rem;padding-bottom:2rem}@media(min-width:768px){.td-404 main,.td-main main{padding-top:5.5rem}}.td-cover-block--height-min{min-height:300px}.td-cover-block--height-med{min-height:400px}.td-cover-block--height-max{min-height:500px}.td-cover-block--height-full{min-height:100vh}@media(min-width:768px){.td-cover-block--height-min{min-height:450px}.td-cover-block--height-med{min-height:500px}.td-cover-block--height-max{min-height:650px}}.td-cover-logo{margin-right:.5em}.td-cover-block{position:relative;padding-top:5rem;padding-bottom:5rem;background-repeat:no-repeat;background-position:50% 0;background-size:cover}.td-cover-block>.byline{position:absolute;bottom:2px;right:4px}.td-bg-arrow-wrapper{position:relative}.section-index .entry{padding:.75rem}.section-index h5,.section-index .h5{margin-bottom:0}.section-index h5 a,.section-index .h5 a{font-weight:700}.section-index p{margin-top:0}.pageinfo{font-weight:500;background:#f8f9fa;color:inherit;border-radius:0;margin:2rem;padding:1.5rem;padding-bottom:.5rem}.pageinfo-primary{border-style:solid;border-color:#081b4b}.pageinfo-secondary{border-style:solid;border-color:#fff}.pageinfo-success{border-style:solid;border-color:#3772ff}.pageinfo-info{border-style:solid;border-color:#c0e0de}.pageinfo-warning{border-style:solid;border-color:#ed6a5a}.pageinfo-danger{border-style:solid;border-color:#ed6a5a}.pageinfo-light{border-style:solid;border-color:#d3f3ee}.pageinfo-dark{border-style:solid;border-color:#403f4c}.td-page-meta__lastmod{margin-top:3rem!important;padding-top:1rem!important}.taxonomy-terms-article{width:100%;clear:both;font-size:.8rem}.taxonomy-terms-article .taxonomy-title{display:inline;font-size:1.25em;height:1em;line-height:1em;margin-right:.5em;padding:0}.taxonomy-terms-cloud{width:100%;clear:both;font-size:.8rem}.taxonomy-terms-cloud .taxonomy-title{display:inline-block;width:100%;font-size:1rem;font-weight:700;color:#081b4b;border-bottom:1px #081b4b solid;margin-bottom:1em;padding-bottom:.375rem;margin-top:1em}.taxonomy-terms-page{max-width:800px;margin:auto}.taxonomy-terms-page h1,.taxonomy-terms-page .h1{margin-bottom:1em}.taxonomy-terms-page .taxonomy-terms-cloud{font-size:1em}.taxonomy-terms-page .taxonomy-terms-cloud li{display:block}.taxonomy-terms-page .taxo-text-tags li+li::before{content:none}.taxonomy-terms-page .taxo-fruits .taxonomy-count,.taxonomy-terms-page .taxo-fruits .taxonomy-label{display:inherit;font-size:1rem;margin:0;padding:0;padding-right:.5em}.taxonomy-terms-page .taxo-fruits .taxonomy-count::before{content:"("}.taxonomy-terms-page .taxo-fruits .taxonomy-count::after{content:")"}.taxonomy-terms{list-style:none;margin:0;overflow:hidden;padding:0;display:inline}.taxonomy-terms li{display:inline;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-webkit-hyphens:auto;hyphens:auto}.taxonomy-count{font-size:.8em;line-height:1.25em;display:inline-block;padding-left:.6em;padding-right:.6em;margin-left:.6em;text-align:center;border-radius:1em;background-color:#fff}.taxonomy-term{background:#e9ecef;border-width:0;border-radius:0 3px 3px 0;color:#6c757d;display:inline-block;font-size:1em;line-height:1.5em;min-height:1.5em;max-width:100%;padding:0 .5em 0 1em;position:relative;margin:0 .5em .2em 0;text-decoration:none;-webkit-transition:color .2s;clip-path:polygon(100% 0,100% 100%,.8em 100%,0 50%,.8em 0)}.taxonomy-term:hover{background-color:#081b4b;color:#fff}.taxonomy-term:hover .taxonomy-count{color:#403f4c!important}.taxonomy-term:hover::before{background:#081b4b}.taxo-text-tags .taxonomy-term{background:0 0;border-width:0;border-radius:0;color:#6c757d;font-size:1em;line-height:1.5em;min-height:1.5em;max-width:100%;padding:0;position:relative;margin:0;text-decoration:none;clip-path:none}.taxo-text-tags .taxonomy-term:hover{background:0 0;color:#0d6efd}.taxo-text-tags .taxonomy-term:hover .taxonomy-count{color:#403f4c!important}.taxo-text-tags .taxonomy-term:hover::before{background:0 0}.taxo-text-tags li+li::before{content:"|";color:#6c757d;margin-right:.2em}.taxo-text-tags .taxonomy-count{font-size:1em;line-height:1.25em;display:inline-block;padding:0;margin:0;text-align:center;border-radius:0;background:0 0;vertical-align:super;font-size:.75em}.taxo-text-tags .taxonomy-term:hover .taxonomy-count{color:#0d6efd!important}.taxo-fruits .taxonomy-term[data-taxonomy-term]::before{font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased;font-family:"font awesome 6 free";padding-right:.5em;font-size:2em;min-width:1.5em;display:inline-block}.taxo-fruits .taxonomy-term[data-taxonomy-term=apple]::before{content:"\f5d1";color:red}.taxo-fruits .taxonomy-term[data-taxonomy-term=carrot]::before{content:"\f787";color:orange}.taxo-fruits .taxonomy-term[data-taxonomy-term=lemon]::before{content:"\f094";color:#32cd32}.taxo-fruits .taxonomy-term[data-taxonomy-term=pepper]::before{content:"\f816";color:darkred}.taxo-fruits .taxonomy-term{background:0 0;border-width:0;border-radius:0;color:#6c757d;font-size:1em;line-height:2.5em;max-width:100%;padding:0;position:relative;margin:0;text-decoration:none;clip-path:none}.taxo-fruits .taxonomy-term:hover{background:0 0;color:#0d6efd}.taxo-fruits .taxonomy-term:hover .taxonomy-count{color:#403f4c!important}.taxo-fruits .taxonomy-term:hover::before{background:0 0;text-shadow:0 0 3px #212529}.taxo-fruits .taxonomy-count,.taxo-fruits .taxonomy-label{display:none}.taxo-fruits.taxonomy-terms-article{margin-bottom:1rem}.taxo-fruits.taxonomy-terms-article .taxonomy-title{display:none}.taxonomy-taxonomy-page{max-width:800px;margin:auto}.taxonomy-taxonomy-page h1,.taxonomy-taxonomy-page .h1{margin-bottom:1em}.article-meta{margin-bottom:1.5rem}.article-teaser.article-type-docs h3 a:before,.article-teaser.article-type-docs .h3 a:before,.article-teaser.article-type-docs .td-footer__links-item a:before{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased;font-family:"font awesome 6 free";content:"\f02d";padding-right:.5em}.article-teaser.article-type-blog h3 a:before,.article-teaser.article-type-blog .h3 a:before,.article-teaser.article-type-blog .td-footer__links-item a:before{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased;font-family:"font awesome 6 free";content:"\f781";padding-right:.5em}.all-taxonomy-terms{font-weight:500;line-height:1.2;font-size:1.5rem}.all-taxonomy-terms:before{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;-webkit-font-smoothing:antialiased;font-family:"font awesome 6 free";content:"\f122";padding-right:.5em}.article-teaser.card,.td-content .article-teaser.highlight{padding:1em;margin-bottom:1.5em}.article-teaser .breadcrumb{margin-bottom:0;font-size:.85rem}.article-teaser .article-meta{margin-bottom:0}div.drawio{display:inline-block;position:relative}div.drawio button{position:absolute;bottom:5px;right:5px;padding:.4em .5em;font-size:.8em;display:none}div.drawio:hover button{display:inline}div.drawioframe{position:fixed;height:100%;width:100%;top:0;left:0;z-index:1000;background:#000b;border:0}div.drawioframe iframe{position:absolute;height:90%;width:90%;top:5%;left:5%;z-index:1010}.tab-content .tab-pane{margin-top:0;margin-bottom:1.5rem;border-left:1px solid rgba(0,0,0,.125);border-right:1px solid rgba(0,0,0,.125);border-bottom:1px solid rgba(0,0,0,.125)}.tab-content .tab-pane .highlight{margin:0;border:none;max-width:100%}.tab-body{font-weight:500;background:#f8f9fa;color:inherit;border-radius:0;padding:1.5rem}.tab-body>:last-child{margin-bottom:0}.tab-body>.highlight:only-child{margin:-1.5rem;max-width:calc(100% + 3rem)}.tab-body-primary{border-style:solid;border-color:#081b4b}.tab-body-secondary{border-style:solid;border-color:#fff}.tab-body-success{border-style:solid;border-color:#3772ff}.tab-body-info{border-style:solid;border-color:#c0e0de}.tab-body-warning{border-style:solid;border-color:#ed6a5a}.tab-body-danger{border-style:solid;border-color:#ed6a5a}.tab-body-light{border-style:solid;border-color:#d3f3ee}.tab-body-dark{border-style:solid;border-color:#403f4c}.td-card.card .highlight,.td-content .td-card.highlight .highlight{border:none;margin:0}.td-card .card-body.code{background-color:#f8f9fa;padding:0 0 0 1ex}.td-card .card-body pre{margin:0;padding:0 1rem 1rem}.swagger-ui .info .title small pre,.swagger-ui .info .title .small pre,.swagger-ui .info .title .td-footer__center pre,.swagger-ui .info .title .td-cover-block>.byline pre{background:#7d8492}.td-footer{min-height:150px;padding-top:3rem}@media(max-width:991.98px){.td-footer{min-height:200px}}.td-footer__center{text-align:center}.td-footer__right{text-align:right}.td-footer__about{font-size:initial}.td-footer__links-list{margin-bottom:0}.td-footer__links-item a{color:inherit!important}.td-footer__authors,.td-footer__all_rights_reserved{padding-left:.25rem}.td-footer__all_rights_reserved{display:none}@media(min-width:768px){.td-offset-anchor:target{display:block;position:relative;top:-4rem;visibility:hidden}h2[id]:before,[id].h2:before,h3[id]:before,[id].h3:before,[id].td-footer__links-item:before,h4[id]:before,[id].h4:before,h5[id]:before,[id].h5:before{display:block;content:" ";margin-top:-5rem;height:5rem;visibility:hidden}} \ No newline at end of file diff --git a/search/index.html b/search/index.html new file mode 100644 index 000000000..713becf91 --- /dev/null +++ b/search/index.html @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + +Search Results | Drycc + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ +
+
+
+
+
+

Search Results

+
+
+ +
+ + +
+ + + + + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 000000000..7770e08ec --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,276 @@ + + + + /docs/users/cli/ + 2024-09-12T22:57:17+08:00 + + /docs/understanding-workflow/concepts/ + 2024-09-12T22:57:17+08:00 + + /docs/reference-guide/creating-a-self-signed-ssl-certificate/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/deploying-apps/ + 2024-09-12T22:57:17+08:00 + + /docs/quickstart/overview/ + 2024-09-12T22:57:17+08:00 + + /docs/contribution-guidelines/overview/ + 2024-09-12T22:57:17+08:00 + + /docs/roadmap/planning-process/ + 2024-09-12T22:57:17+08:00 + + /docs/quickstart/ + 2024-09-12T22:57:17+08:00 + + /docs/installing-workflow/system-requirements/ + 2024-09-12T22:57:17+08:00 + + /docs/troubleshooting/workflow/ + 2024-09-12T22:57:17+08:00 + + /docs/managing-workflow/tuning-component-settings/ + 2024-09-12T22:57:17+08:00 + + /docs/understanding-workflow/architecture/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/using-buildpacks/ + 2024-09-12T22:57:17+08:00 + + /docs/managing-workflow/configuring-dns/ + 2024-09-12T22:57:17+08:00 + + /docs/contribution-guidelines/design-documents/ + 2024-09-12T22:57:17+08:00 + + /docs/quickstart/install-workflow/ + 2024-09-12T22:57:17+08:00 + + /docs/installing-workflow/gateway/ + 2024-09-12T22:57:17+08:00 + + /docs/installing-workflow/workflow/ + 2024-09-12T22:57:17+08:00 + + /docs/roadmap/roadmap/ + 2024-09-12T22:57:17+08:00 + + /docs/troubleshooting/kubectl/ + 2024-09-12T22:57:17+08:00 + + /docs/understanding-workflow/ + 2024-09-12T22:57:17+08:00 + + /docs/users/registration/ + 2024-09-12T22:57:17+08:00 + + /docs/understanding-workflow/components/ + 2024-09-12T22:57:17+08:00 + + /docs/reference-guide/controller-api-v2-0/ + 2024-09-12T22:57:17+08:00 + + /docs/managing-workflow/deploy-hooks/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/using-dockerfiles/ + 2024-09-12T22:57:17+08:00 + + /docs/contribution-guidelines/development-environment/ + 2024-09-12T22:57:17+08:00 + + /docs/quickstart/install-cli-tools/ + 2024-09-12T22:57:17+08:00 + + /docs/installing-workflow/ + 2024-09-12T22:57:17+08:00 + + /docs/roadmap/releases/ + 2024-09-12T22:57:17+08:00 + + /docs/users/ssh-keys/ + 2024-09-12T22:57:17+08:00 + + /docs/troubleshooting/applications/ + 2024-09-12T22:57:17+08:00 + + /docs/installing-workflow/configuring-object-storage/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/using-container-images/ + 2024-09-12T22:57:17+08:00 + + /docs/reference-guide/controller-api-v2-1/ + 2024-09-12T22:57:17+08:00 + + /docs/quickstart/deploy-an-app/ + 2024-09-12T22:57:17+08:00 + + /docs/managing-workflow/platform-logging/ + 2024-09-12T22:57:17+08:00 + + /docs/contribution-guidelines/testing/ + 2024-09-12T22:57:17+08:00 + + /docs/users/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/ + 2024-09-12T22:57:17+08:00 + + /docs/installing-workflow/configuring-postgres/ + 2024-09-12T22:57:17+08:00 + + /docs/installing-workflow/configuring-registry/ + 2024-09-12T22:57:17+08:00 + + /docs/reference-guide/controller-api-v2-2/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/managing-app-processes/ + 2024-09-12T22:57:17+08:00 + + /docs/managing-workflow/ + 2024-09-12T22:57:17+08:00 + + /docs/managing-workflow/platform-monitoring/ + 2024-09-12T22:57:17+08:00 + + /docs/contribution-guidelines/submitting-a-pull-request/ + 2024-09-12T22:57:17+08:00 + + /docs/contribution-guidelines/community/ + 2024-09-12T22:57:17+08:00 + + /docs/reference-guide/controller-api-v2-3/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/managing-app-configuration/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/managing-app-metrics/ + 2024-09-12T22:57:17+08:00 + + /docs/managing-workflow/production-deployments/ + 2024-09-12T22:57:17+08:00 + + /docs/managing-workflow/upgrading-workflow/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/managing-app-lifecycle/ + 2024-09-12T22:57:17+08:00 + + /docs/contribution-guidelines/triaging-issues/ + 2024-09-12T22:57:17+08:00 + + /docs/troubleshooting/ + 2024-09-12T22:57:17+08:00 + + /docs/contribution-guidelines/conduct/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/managing-app-volumes/ + 2024-09-12T22:57:17+08:00 + + /docs/roadmap/ + 2024-09-12T22:57:17+08:00 + + /docs/contribution-guidelines/ + 2024-09-12T22:57:17+08:00 + + /docs/contribution-guidelines/maintainers/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/managing-app-gateway/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/managing-app-resources/ + 2024-09-12T22:57:17+08:00 + + /blog/news/ + 2024-09-12T22:57:17+08:00 + + /docs/reference-guide/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/inter-app-communication/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/managing-resource-limits/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/domains-and-routing/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/ssl-certificates/ + 2024-09-12T22:57:17+08:00 + + /docs/applications/using-dryccfile/ + 2024-09-12T22:57:17+08:00 + + /docs/ + 2024-09-12T22:57:17+08:00 + + /blog/releases/ + 2024-09-12T22:57:17+08:00 + + /blog/2024/05/01/drycc-workflow-v1.7.8/ + 2024-09-12T22:57:17+08:00 + + /blog/2024/04/30/drycc-workflow-v1.7.7/ + 2024-09-12T22:57:17+08:00 + + /blog/2024/02/27/drycc-workflow-v1.7.5/ + 2024-09-12T22:57:17+08:00 + + /blog/2024/02/27/drycc-workflow-v1.7.6/ + 2024-09-12T22:57:17+08:00 + + /blog/2024/01/29/drycc-workflow-v1.7.2/ + 2024-09-12T22:57:17+08:00 + + /blog/2023/12/08/drycc-workflow-v1.7.0/ + 2024-09-12T22:57:17+08:00 + + /blog/2022/10/21/drycc-workflow-v1.6.0/ + 2024-09-12T22:57:17+08:00 + + /blog/2022/10/06/drycc-workflow-v1.5.0/ + 2024-09-12T22:57:17+08:00 + + /blog/2021/10/06/drycc-workflow-v1.4.0/ + 2024-09-12T22:57:17+08:00 + + /blog/2020/10/06/drycc-workflow-v1.3.0/ + 2024-09-12T22:57:17+08:00 + + /blog/2019/10/06/drycc-workflow-v1.2.0/ + 2024-09-12T22:57:17+08:00 + + /blog/2018/10/06/welcome-to-drycc/ + 2024-09-12T22:57:17+08:00 + + /about/ + 2024-09-12T22:57:17+08:00 + + /blog/ + 2024-09-12T22:57:17+08:00 + + /categories/ + + /community/ + 2024-09-12T22:57:17+08:00 + + / + 2024-09-12T22:57:17+08:00 + + /search/ + 2024-09-12T22:57:17+08:00 + + /tags/ + + diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 000000000..e2b29a334 --- /dev/null +++ b/tags/index.html @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + +Tags | Drycc + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+

Tags

+
+
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/tags/index.xml b/tags/index.xml new file mode 100644 index 000000000..22f24e165 --- /dev/null +++ b/tags/index.xml @@ -0,0 +1,18 @@ + + + Drycc – Tags + /tags/ + Recent content in Tags on Drycc + Hugo -- gohugo.io + en + + + + + + + + + + + diff --git a/uninstall.sh b/uninstall.sh new file mode 100644 index 000000000..4a531a28f --- /dev/null +++ b/uninstall.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -eo pipefail +shopt -s expand_aliases + +# clean cilium +ip link delete cilium_host > /dev/null 2>&1 || true +ip link delete cilium_net > /dev/null 2>&1 || true +ip link delete cilium_vxlan > /dev/null 2>&1 || true +ip link delete nodelocaldns > /dev/null 2>&1 || true +iptables-save | grep -iv cilium | iptables-restore || true +ip6tables-save | grep -iv cilium | ip6tables-restore || true + +/usr/local/bin/k3s-killall.sh + +if [[ -x /usr/local/bin/k3s-uninstall.sh ]] ; then + /usr/local/bin/k3s-uninstall.sh +fi + +if [[ -x /usr/local/bin/k3s-agent-uninstall.sh ]] ; then + /usr/local/bin/k3s-agent-uninstall.sh +fi + +if [[ -n "${K3S_DATA_DIR}" ]] ; then + rm -rf "${K3S_DATA_DIR}/rancher" +fi + +iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT + +rm -rf /etc/rancher +rm -rf /etc/cni/net.d/* +rm -rf /var/lib/rancher/ +rm -rf /usr/local/bin/*runsc* /usr/local/bin/crun +rm -rf /usr/local/bin/helm ~/.config/helm diff --git a/webfonts/fa-brands-400.ttf b/webfonts/fa-brands-400.ttf new file mode 100644 index 000000000..c6897d680 Binary files /dev/null and b/webfonts/fa-brands-400.ttf differ diff --git a/webfonts/fa-brands-400.woff2 b/webfonts/fa-brands-400.woff2 new file mode 100644 index 000000000..720ed5788 Binary files /dev/null and b/webfonts/fa-brands-400.woff2 differ diff --git a/webfonts/fa-regular-400.ttf b/webfonts/fa-regular-400.ttf new file mode 100644 index 000000000..8875b4040 Binary files /dev/null and b/webfonts/fa-regular-400.ttf differ diff --git a/webfonts/fa-regular-400.woff2 b/webfonts/fa-regular-400.woff2 new file mode 100644 index 000000000..bf590c938 Binary files /dev/null and b/webfonts/fa-regular-400.woff2 differ diff --git a/webfonts/fa-solid-900.ttf b/webfonts/fa-solid-900.ttf new file mode 100644 index 000000000..55a68d9d0 Binary files /dev/null and b/webfonts/fa-solid-900.ttf differ diff --git a/webfonts/fa-solid-900.woff2 b/webfonts/fa-solid-900.woff2 new file mode 100644 index 000000000..596c8cb68 Binary files /dev/null and b/webfonts/fa-solid-900.woff2 differ diff --git a/webfonts/fa-v4compatibility.ttf b/webfonts/fa-v4compatibility.ttf new file mode 100644 index 000000000..32c6f0c27 Binary files /dev/null and b/webfonts/fa-v4compatibility.ttf differ diff --git a/webfonts/fa-v4compatibility.woff2 b/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 000000000..59b20fe1b Binary files /dev/null and b/webfonts/fa-v4compatibility.woff2 differ diff --git a/workflow-cli.txt b/workflow-cli.txt new file mode 100644 index 000000000..e72fc12fb --- /dev/null +++ b/workflow-cli.txt @@ -0,0 +1,8 @@ +https://drycc-mirrors.drycc.cc/drycc/workflow-cli/releases/download/v1.9.0/drycc-v1.9.0-darwin-amd64 +https://drycc-mirrors.drycc.cc/drycc/workflow-cli/releases/download/v1.9.0/drycc-v1.9.0-darwin-arm64 +https://drycc-mirrors.drycc.cc/drycc/workflow-cli/releases/download/v1.9.0/drycc-v1.9.0-linux-386 +https://drycc-mirrors.drycc.cc/drycc/workflow-cli/releases/download/v1.9.0/drycc-v1.9.0-linux-amd64 +https://drycc-mirrors.drycc.cc/drycc/workflow-cli/releases/download/v1.9.0/drycc-v1.9.0-linux-arm +https://drycc-mirrors.drycc.cc/drycc/workflow-cli/releases/download/v1.9.0/drycc-v1.9.0-linux-arm64 +https://drycc-mirrors.drycc.cc/drycc/workflow-cli/releases/download/v1.9.0/drycc-v1.9.0-windows-386 +https://drycc-mirrors.drycc.cc/drycc/workflow-cli/releases/download/v1.9.0/drycc-v1.9.0-windows-amd64